zoukankan      html  css  js  c++  java
  • 螺旋数组

    写在前面:依然是在《程序员面试宝典》看到的例题:输入N,用C++生成N*N的螺旋数组,并打印出来。书上给了实现代码,http://www.cnblogs.com/lovell-liu/archive/2011/09/19/2181598.html也有很好的实现代码,当然我自己也实现了。


    /*
    螺旋数组是一个从中心螺旋形扩展的数组,如8*8的螺旋数组:
        49    50    51    52    53    54    55    56
        48    25    26    27    28    29    30    57
        47    24     9    10    11    12    31    58
        46    23     8     1     2    13    32    59
        45    22     7     0     3    14    33    60
        44    21     6     5     4    15    34    61
        43    20    19    18    17    16    35    62
        42    41    40    39    38    37    36    63
    */
    
    #include <iostream>
    #include <vector>
    #include <iomanip>
    
    using namespace std;
    
    int main()
    {
        int N;
        int s,i,j,dir,step;
        int squa;
        cout<<"将要实现N*N的zigzag矩阵,请输入N([1 100]):";
        bool input_again=false; 
        cin>>N; 
        
        //生成行进方向向量
        squa=N*N;
        vector<int> dirs(squa);//四个行进方向0(上),1(右),2(下),3(左)
        s=0;    //计数器 
        dir=0;  //方向 
        step=1; //步长 
        while(s<squa)
        {       
           //走一步,步长为step 
           for(i=0;i<step;i++)
               dirs[s++]=dir;
           if(dir%2)              //下一步的步长
              step++;             //方向为1,3时,下一步的步长加一 
           dir=(dir+1)%4;         //下一步的方向              
        }
              
        //中心坐标, 即螺旋中心坐标
        if(N%2)   //奇数 
        {
           i=(N-1)/2;
           j=i;                
        }
        else     //偶数 
        {
           i=N/2;
           j=i-1;        
        } 
        
        //生成螺旋数组 
        vector<vector<int> > spiral(N,vector<int>(N));
        s=0;
        while(s<squa)
        {
          spiral[i][j]=s;
          //根据行进方向向量dirs, 确定下一点的位置 
          switch(dirs[s])
          {
              case 0:
                    i--;
                    break;
              case 1:
                    j++;
                    break;
              case 2:
                    i++;
                    break;
              case 3:
                    j--;
                    break;
              default:
                    break; 
          }
          s++;              
        }
        
        
        cout<<"*************************************************************"<<endl;
        cout<<N<<"*"<<N<<"的螺旋数组:"<<endl;
        for(i=0;i<N;i++)
        {
             for(j=0;j<N;j++)
                    cout<<setw(6)<<spiral[i][j];
             cout<<endl;
        }
        
        cout<<"按任意键继续……";
        cin.clear();
        cin.sync();
        cin.get();
        return 0;
    }
  • 相关阅读:
    树的遍历
    动态规划之背包问题
    Dijkstra算法
    最短路径
    关于数学公式Markdown
    子集数
    O、Θ、Ω
    AT212 P-CASカードと高橋君
    vector的使用方法
    P3512 [POI2010]PIL-Pilots 单调队列的应用
  • 原文地址:https://www.cnblogs.com/emituofo/p/2608702.html
Copyright © 2011-2022 走看看