zoukankan      html  css  js  c++  java
  • 螺旋矩阵

    我们根据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

  • 相关阅读:
    window下安装jupyter,ipython的方法
    虚拟机中,安装VM tools的小发现
    Perl 与 Python 之间的一些异同
    perl中的grep函数介绍
    基因芯片(Affymetrix)分析1:芯片质量分析
    议员是如何投票的?
    社会网络分析:探索人人网好友推荐系统
    支持向量机(一)
    主成分分析(Principal components analysis)-最小平方误差解释
    因子分析(Factor Analysis)
  • 原文地址:https://www.cnblogs.com/ziyuan122625/p/12000950.html
Copyright © 2011-2022 走看看