所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
输入样例:
5
输出样例:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
思路讲解:
本题要求输出一个规模为n*n的螺旋矩阵。使用一个二维数组a[10][10]来存储螺旋方阵,使用变量k来表示当前要填充的数字,变量x和y表示当前的行和列,变量t表示当前圈的边长。然后就要进行循环,循环的次数为n/2,顺时针填入k的值。使用两个嵌套的for循环来循环填充每一圈,外层循环控制填充的圈数,内层循环分别填充每一条边。在每一圈中,首先从左到右填充一行,然后从上到下填充一列,接着从右到左填充一行,最后从下到上填充一列。每填充完一条边后,更新x和y的值,继续填充下一条边。在填充完所有圈后,如果n为奇数,还需要单独处理中心位置。
最后,代码使用两个嵌套的for循环遍历二维数组,输出结果。(注意每个数字占3位)
完整代码:
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a[10][10],k=1,x=0,y=0;
int t=n-1;
for(int i=0;i<n/2;i++){
for(int j=0;j<t;j++) a[x][y++]=k++;
for(int j=0;j<t;j++) a[x++][y]=k++;
for(int j=0;j<t;j++) a[x][y--]=k++;
for(int j=0;j<t;j++) a[x--][y]=k++;
x++;y++;t-=2;
}
if(n%2!=0) a[n/2][n/2]=k;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%3d",a[i][j]);
}
printf("\n");
}
}