所谓“螺旋方阵”,是指对任意给定的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
核心思路:
由于单看每一行,或者单看每一列,不能找到适用于整体的规律。所以,我选择按照题目叙述,走螺旋形将二维数组a[n][n]赋值,再用print将a[n][n]打印出即可。
其中,分层走圈,层(layer),所以最外面的for循环表示到了第几层圈,里面在用上下左右四个for循环来走螺旋。
值得注意的是,假设我们旋转方向为从左上角开始做顺时针旋转,每一次的起点恰好为a[layer][layer]。而且为了保证转圈时我们走的步数是一致的,所以每次只走n=n-2**layer*-1*步(例如n=5时,向右走4个数,向下走4个数,向左走4个数,向上走4个数,刚好走完一圈),只需注意接着上一次走完的点即可。
其中有段代码if(n%2 != 0) a[n/2][n/2] = n*n;
极其重要,因为当n为奇数地时候,最中间地数无法打印出来,所以只能手动添加。我思考了很久,原因是为第一个起点数赋值时,是在第一个向右走的循环里赋值的,所以让走到最后一层时(即单数时的中心),自然无法赋值。
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[10][10];
int num = 1;
int layer;
int up,down,left,right;
for(layer=0; layer<n/2+1; layer++){
for(right=0; right<n-2*layer-1; right++,num++){
a[layer][layer+right] = num;
}
for(down=0; down<n-2*layer-1; down++,num++){
a[layer+down][right+layer] = num;
}
for(left=0; left<n-2*layer-1; left++,num++){
a[layer+down][right+layer-left] = num;
}
for(up=0; up<n-2*layer-1; up++,num++){
a[layer+down-up][right+layer-left] = num;
}
}
if(n%2 != 0)
a[n/2][n/2] = n*n;
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}