螺旋数组

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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午7:35
下一篇 2023年2月9日 上午7:37

相关推荐