螺旋數組


寫在前面:依然是在《程序員面試寶典》看到的例題:輸入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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM