螺旋矩阵

我们根据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(" ");

     }

}

然后ak了zzz

原文地址:https://www.cnblogs.com/ziyuan122625/p/12000950.html