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