您的位置:首页 > 编程语言 > C语言/C++

螺旋矩阵(c语言实现)

2016-04-03 22:38 489 查看
腾讯2016年实习生笔试题

蛇形矩阵,也叫螺旋矩阵,指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,

向左变大,向上变大,如此循环。

/*

思想就是:

螺旋,有四个方向,从左到右,从上到下,从右到左,从下到上。

对于第一步,要先加上c,c从0开始,每次执行完一圈,就加1

第一个方向,从左到右,从(c,c)开始,从左到右,行i不变,列j从c一直加到n-c-1

第二个方向,从上到下,因为列j在上一步加的多了一个,需要对j进行j--,对于i也要加1,因为第i行的所有数字,在上一步都完成了。

这一步,是列j不变,行i从上一步的i加1 ,一直加到n-c-1

第三个方向,从右到左,因为行i在上一步加多了一步,需要对i进行i--。这一步,需要行i不变,列j需要j--,直到c。

第四个方向,从下到上,因为列j在上一步减多了一步,需要对j进行j++,这一步,需要列j不变,行i一直i--,直到c+1.不能到c,因为不能到达第c行,

第c行在第一个方向上已经赋值过了。

*/

#include<iostream>

using namespace std;

const int NMAX= 100;

int n;

/*

思想就是:

螺旋,有四个方向,从左到右,从上到下,从右到左,从下到上。

对于第一步,要先加上c,c从0开始,每次执行完一圈,就加1

第一个方向,从左到右,从(c,c)开始,从左到右,行i不变,列j从c一直加到n-c-1

第二个方向,从上到下,因为列j在上一步加的多了一个,需要对j进行j--,对于i也要加1,因为第i行的所有数字,在上一步都完成了。

这一步,是列j不变,行i从上一步的i加1 ,一直加到n-c-1

第三个方向,从右到左,因为行i在上一步加多了一步,需要对i进行i--。这一步,需要行i不变,列j需要j--,直到c。

第四个方向,从下到上,因为列j在上一步减多了一步,需要对j进行j++,这一步,需要列j不变,行i一直i--,直到c+1.不能到c,因为不能到达第c行,

第c行在第一个方向上已经赋值过了。

*/

void getluoxuan1(int arrays[NMAX][NMAX])

{

//核心算法:

cout<<"从外到内螺旋,且数字从小到大,从矩阵的左上角开始从数字1开始螺旋:"<<endl;

int c=0,i,j;

int z = n*n;

int ou=1;

while(ou<=z)

{

i=0;

j=0;

for(i+=c,j+=c;j<n-c;j++) //从左到右

{

if(ou>z) break;

arrays[i][j] = ou++;

}

for(j--,i++;i<n-c;i++) // 从上到下

{

if(ou>z) break;

arrays[i][j] = ou++;

}

for(i--,j--;j>=c;j--)//从右到左

{

if(ou>z) break;

arrays[i][j] = ou++;

}

for(j++,i--;i>=c+1;i--)//从下到上

{

if(ou>z) break;

arrays[i][j] = ou++;

}

c++;

}

}

void getluoxuan11(int arrays[NMAX][NMAX])

{

cout<<"从矩阵的左上角开始从数字的最大值开始螺旋"<<endl;

int c=0,i,j;

int z = n*n;

int ou=z;

while(ou>=1)

{

i=0;

j=0;

for(i+=c,j+=c;j<n-c;j++) //从左到右

{

if(ou>z) break;

arrays[i][j] = ou--;

}

for(j--,i++;i<n-c;i++) // 从上到下

{

if(ou>z) break;

arrays[i][j] = ou--;

}

for(i--,j--;j>=c;j--)//从右到左

{

if(ou>z) break;

arrays[i][j] = ou--;

}

for(j++,i--;i>=c+1;i--)//从下到上

{

if(ou>z) break;

arrays[i][j] = ou--;

}

c++;

}

}

void getluoxuan2(int arrays[NMAX][NMAX])

{

cout<<"从矩阵的右上角开始从数字1开始螺旋:"<<endl;

int c=0,i,j;

int z = n*n;

int ou=1;

while(ou<=z)

{

i=0;

j=0;

for(i=c,j=n-c-1;j>=c;j--) //从右到左

{

if(ou>z) break;

arrays[i][j] = ou++;

}

for(j++,i++;i<n-c;i++) // 从上到下

{

if(ou>z) break;

arrays[i][j] = ou++;

}

for(i--,j++;j<n-c;j++)//从左到右

{

if(ou>z) break;

arrays[i][j] = ou++;

}

for(j--,i--;i>=c+1;i--)//从下到上

{

if(ou>z) break;

arrays[i][j] = ou++;

}

c++;

}

}

void getluoxuan22(int arrays[NMAX][NMAX])

{

cout<<"从矩阵的右上角开始从矩阵的最大值开始螺旋:"<<endl;

int c=0,i,j;

int z = n*n;

int ou=z;

while(ou>=1)

{

i=0;

j=0;

for(i=c,j=n-c-1;j>=c;j--) //从右到左

{

if(ou>z) break;

arrays[i][j] = ou--;

}

for(j++,i++;i<n-c;i++) // 从上到下

{

if(ou>z) break;

arrays[i][j] = ou--;

}

for(i--,j++;j<n-c;j++)//从左到右

{

if(ou>z) break;

arrays[i][j] = ou--;

}

for(j--,i--;i>=c+1;i--)//从下到上

{

if(ou>z) break;

arrays[i][j] = ou--;

}

c++;

}

}

void diaplay(int arrays[NMAX][NMAX])

{

int i,j;

for(i=0;i<n;i++)

{

for(j=0;j<n;j++)

printf("%5d",arrays[i][j]);

//cout<<arrays[i][j]<<" ";

cout<<endl;

}

}

int main()

{

int arrays[NMAX][NMAX];

cin>>n;

int i,j;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

arrays[i][j] = 0;

cout<<"从外到内螺旋,且数字从小到大,从矩阵的左上角开始从数字1开始螺旋:"<<endl;

getluoxuan1(arrays);

diaplay(arrays);

cout<<endl;

cout<<"从矩阵的右上角开始从数字1开始螺旋:"<<endl;

getluoxuan2(arrays);

diaplay(arrays);

cout<<endl;

cout<<"从矩阵的左上角开始从数字的最大值开始螺旋"<<endl;

getluoxuan11(arrays);

diaplay(arrays);

cout<<endl;

cout<<"从矩阵的右上角开始从矩阵的最大值开始螺旋:"<<endl;

getluoxuan22(arrays);

diaplay(arrays);

}

4阶螺旋矩阵运行结果:



5阶螺旋矩阵运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: