螺旋矩阵(c语言实现)

发布于:2021-10-23 09:49:25

腾讯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

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开始螺旋:"<

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

{


if(ou>z) break;


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


}


for(j--,i++;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<<"从矩阵的左上角开始从数字的最大值开始螺旋"<

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

{


if(ou>z) break;


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


}


for(j--,i++;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开始螺旋:"<

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

{


if(ou>z) break;


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


}


for(i--,j++;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<<"从矩阵的右上角开始从矩阵的最大值开始螺旋:"<

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

{


if(ou>z) break;


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


}


for(i--,j++;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

{


for(j=0;j

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


//cout<

cout<

}

}

int main()

{


int arrays[NMAX][NMAX];


cin>>n;


int i,j;


for(i=0;i

for(j=0;j

arrays[i][j] = 0;


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

getluoxuan1(arrays);


diaplay(arrays);





cout<

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

getluoxuan2(arrays);


diaplay(arrays);





cout<

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

getluoxuan11(arrays);


diaplay(arrays);






cout<

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

getluoxuan22(arrays);


diaplay(arrays);






}


4阶螺旋矩阵运行结果:




5阶螺旋矩阵运行结果:



相关推荐

最新更新

猜你喜欢