特殊矩阵打印

来源:互联网 发布:域名是否被墙 编辑:程序博客网 时间:2024/05/01 06:47
本文讨论一些特殊矩阵的打印方法
  1. int getNumberWidth(int number){//获取number的位数
  2.  int width=0;
  3.  while(number){
  4.   number/=10;
  5.   width++;
  6.  }
  7.  return width;
  8. }
  1. //n=5:
  2. //1   2   9   10 25
  3. //4   3   8   11 24
  4. //5   6   7   12 23
  5. //16 15 14 13 22
  6. //17 18 19 20 21
  7. void printMatrix(int size){
  8.     int width=getNumberWidth(size*size);  
  9.     width++;
  10.     setfill(' ');
  11.     cout.flags(ios::left);
  12.     int start=1;
  13.     int colStep;
  14.     for(int i=1;i<=size;i++){
  15.         colStep=i%2?1:-1;
  16.         int pre=i%2?start-1:start+(4*(i-1)+1);
  17.         start=pre;
  18.         for(int j=1;j<=size;j++){
  19.             if(j<=i)
  20.                 cout<<setw(width)<<(pre=pre+colStep);
  21.             else
  22.                 if(j%2==0)
  23.                     cout<<setw(width)<<(pre=pre+2*i-1);
  24.                 else
  25.                     printf(t,(pre=pre+4*(j-1)-2*i+1));
  26.         }
  27.         cout<<endl;
  28.     }
  29. }
  1. //n=6
  2. //1  2  2  2  2  1
  3. //1  2  3  3  2  1
  4. //1  2  3  3  2  1
  5. //1  2  3  3  2  1
  6. //1  2  3  3  2  1
  7. //1  1  1  1  1  1
  8. void printmatrix(int n) {
  9.   for (int ii=0, maxval=2, delta=2; ii < n; ++ii, maxval+=delta) {
  10.     if (ii == (n>>1)) {
  11.       delta = -2;
  12.       maxval -= (n & 1) ? 1 : 3;
  13.     }
  14.     for (int jj = 0 ; jj < n; ++jj) {
  15.       int curval = (jj < (n>>1)) ? jj+1 : n-jj;
  16.       cout << min(curval, maxval) << ' ';
  17.     }
  18.     cout << endl;
  19.   }
  20.   cout << endl;
  21. }
  1. //数组螺旋方向
  2. enum Direction{
  3.     LeftTop,//数组第一个元素位于左上角
  4.     RightTop,//数组第一个元素位于右上角
  5.     LeftBottom,//数组第一个元素位于左下角
  6.     RightBottom//数组第一个元素位于右下角
  7. };
  8. //数组顺时针还是逆时针旋转
  9. enum Wise{
  10.     CounterClock,
  11.     Clock
  12. };
  13. //获取螺旋数组指定i,j位置的值
  14. int getCircleNumber(int n,int i,int j,Direction direction,Wise wise,int base=1){
  15.      int index=min(i,j);
  16.      index=min(index,n-max(i,j)-1);
  17.      int len=n-2*index-1;
  18.      int first=base+4*index*(n-index);
  19.      int bound=len+index;
  20.      if(i==index)//数组第一个元素位于左上角的情况
  21.          first+=wise==Clock?j-index:i==j?0:3*len+(bound-j);
  22.      else if(i==bound){
  23.          first+=wise==Clock?2*len+(bound-j):len+(j-index);
  24.      }
  25.      else if(j==index){
  26.          first+=wise==Clock?3*len+(bound-i):i-index;
  27.      }
  28.      else
  29.          first+=wise==Clock?len+(i-index):2*len+(bound-i);
  30.      switch(direction){
  31.          case LeftTop:                   
  32.              break;
  33.          case RightTop://右上角情况,相当于左上角的情况旋转90度
  34.              if(i==index)
  35.                  first+=wise==Clock?(j!=bound?3*len:-len):(i!=j?-3*len:len);
  36.              else
  37.                  first+=wise==Clock?-len:len;
  38.              break;
  39.          case RightBottom://旋转180度
  40.              if(i==index || (j==bound &&i!=bound))
  41.                  first+=wise==Clock?2*len:(i!=j?-2*len:2*len);
  42.              else
  43.                  first+=wise==Clock?-2*len:i!=j?2*len:-2*len;
  44.              break;
  45.          case LeftBottom://旋转270度
  46.              if(j==index)
  47.                  first+=wise==Clock?(i!=index?-3*len:len):(i!=bound?3*len:-len);
  48.              else
  49.                  first+=wise==Clock?len:-len;
  50.              break;
  51.      }
  52.      return first;
  53. }
  54. //n=5
  55. //1   2   3   4   5
  56. //16 17 18 19 6
  57. //15 24 25 20 7
  58. //14 23 22 21 8
  59. //13 12 11 10 9
  60. void print2Matrix(int n,Direction direction,Wise wise,int base=1){
  61.     int width=getNumberWidth(n*n);
  62.     width++;
  63.     setfill(' ');
  64.     cout.flags(ios::left);
  65.     for(int i=0;i<n;i++){
  66.         for(int j=0;j<n;j++){
  67.             cout<<setw(width)<<getCircleNumber(n,i,j,direction,wise,base)<<" ";
  68.         }
  69.         cout<<endl;
  70.     }
  71. }
  72. //n=7
  73. //7  8   9   4  5   6   7
  74. //6  13 10 3  12 13 8
  75. //5  12 11 2  11 10 9
  76. //4  3   2   1  2   3   4 
  77. //9  10 11 2  11 12 5
  78. //8  13 12 3  10 13 6
  79. //7  6   5   4  9   8   7
  80. void print4Matrix(int n){
  81.     int len=n>>1;
  82.     int width=getNumberWidth(len*len+len+2);
  83.     width++;
  84.     setfill(' ');
  85.     cout.flags(ios::left);
  86.     for(int i=0;i<n;i++){
  87.         int num=0;
  88.         int ii=i<len?i:i-len-1;
  89.         for(int j=0;j<n;j++){
  90.             Direction dire;
  91.             if(i<len)
  92.                 dire=j<len?LeftBottom:LeftTop;
  93.             else
  94.                 dire=j<len?RightBottom:RightTop;
  95.             if(i==len)//两个中轴线的情况,横轴
  96.                 num=j<=len?(len+1-j):(j-len+1);
  97.             else if(j==len)//竖轴
  98.                 num=i<=len?(len+1-i):(i-len+1);
  99.             else{//分别处理四角螺旋矩阵
  100.                 num=getCircleNumber(len,ii,j<len?j:j-len-1,dire,Clock,len+2);
  101.             }
  102.             cout<<setw(width)<<num<<' ';
  103.         }
  104.         cout<<endl;
  105.     }
  106. }
原创粉丝点击