我们根据4*4矩阵找一下规律:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
观察可知 以右上角的一开始,可将最外圈规律为1,2,3 4,5,6 7,8,9 10,11,12四组,即从1开始向下三个,再向右三个,以此类推;而中间四个数可以看作 13 14 15 16四组,每组一个;而可以观察并猜想出第一圈每组数的个数为(n-1),依次递减2;
然后用5*5验证:
13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5
惊讶的发现zdx ak了ioi!!!!完全符合我们的规律!于是高兴,准备脱发;但又出现了新的问题!我们发现,如果是奇数的话,最中央的一个数是没太好办法处理的,于是我们可以特别无耻的特判一下,完美解决;
然后敲代码吧 zzz;
#include<cstdio>
using namespace std;
int main(){
int n,p,q,x=1;
scanf("%d",&n);
p=1; //确保第一个数的位置在最右上角
q=n;
int a[n+2][n+2];
for(int m=n-1;m>0;m-=2){ //m为每组数的个数,依次递减2至<0即为层数
for(int k=1;k<=4;k++){ //一层四组
if(k==1){ //由于每组数的方向都有改变,故依次进行处理
for(int i1=1;i1<=m;i1++){
a[p][q]=x;
p++;
x++; //由于p++写在赋值后,故自动跳到下一组初始,如第一层n==4,k==1时向下到(4,4),即第二组数开始;
}
}
if(k==3){
for(int i1=1;i1<=m;i1++){
a[p][q]=x;
p--;
x++;
}
}
if(k==2){
for(int i1=1;i1<=m;i1++){
a[p][q]=x;
q--;
x++;
}
}
if(k==4){ //注意!此处应跳到下一层的右上角,故循环后须使p,q的值正确,不要脸的特判即可
for(int i1=1;i1<=m;i1++){
a[p][q]=x;
q++;
x++;
}
q--;
p++;
}
}
}
if(n%2==1){
a[(n/2)+1][(n/2)+1]=x; //不要脸的特判最中央的数
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%5d",a[i][j]);
}
printf("\n");
}
}
然后ak了zzz
原文:https://www.cnblogs.com/ziyuan122625/p/12000950.html