#include<stdio.h>
int main() {
int n, direcion[4][2] = {{0,-1},{1,0},{0,1},{-1,0}};
scanf("%d",&n);
int num[2*n];
num[1] = n;
for(int i=2, n_=n-1;i<=2*n-1;i=i+2,n_--){
num[i] = n_;
num[i+1] = n_;
}
int x=0,y=n,point[n][n];
int nu=1,k=0,j=0;
for(int i=1;i<=n*n;i++){
x = x+direcion[j%4][0], y = y+direcion[j%4][1];
point[x][y] = i;
k++;
if(k==num[nu]){
nu++;
k=0;
j++;
}
}
for(int i=0;i<n;i++){
for(int g=0;g<n;g++)
printf("%4d",point[i][g]);
printf("\n");
}
return 1;
}
这个是有规律可循的。
我以n=6为例子找规律。
从[0,5]开始,填充6个数字,然后填充5个数字,然后填充5个数字,然后4个,4个,3,3,2,2,1,1.分别填充的数字个数是这些。
所以代码中num数组的内容就是这些[6,5,5,4,4,3,3,2,2,1,1]
point数组记录的就是整个二位数组的内容。x和y分别是下标
direction数组,分别是x和y的改变量,因为左下右上,只有四种改变,所以direction也是四种,轮着来用。
用变量k记录当前填充了几个数字了,如果等于num数组中对应的数,就做三个改变:num的下标nu加一(表示该填充下一个数量的数字了)、k归零(表示重新计数)、坐标xy的改变量也要变。
挺有意思的