写在前面:依然是在《程序员面试宝典》看到的例题:输入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; }