写在前面:依然是在《程序员面试宝典》看到的例题:输入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;
}
原文链接: https://www.cnblogs.com/emituofo/archive/2012/07/25/2608702.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/56778
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!