一个螺旋排列的数组实现

要求如下:
给定一个2维数组Array[row][col],让其呈螺纹状排列。
如:
数组:Array[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
让其重新排序如下:


E:\Programming\c_cpp>HelixArray
请输入螺旋数组的维数(2维:行--列):4 4
螺旋数组如下:
1       2       3       4
12      13      14      5
11      16      15      6
10      9       8       7

图示如下:

以前曾经实现过,后来电脑被偷了(郁闷,整个家都被洗劫一空),代码也没有了,今天想起,只好重新实现了。
花了偶一上午时间,写了出来,呵呵…………^#^……
代码如下:


/*
文件名:HelixArray.cpp
螺旋数组
作者:iawen
*/

#include
using namespace std;

int main()
{
  int nR,nC;
  cout<<"请输入螺旋数组的维数(2维:行--列):";
  cin>>nR>>nC;
  cout<<"螺旋数组如下:\n";
  
  int *nArray=new int[nR*nC];
  int n=1;
  int i=0,j=0;
  int rowEnd=nR;  //避免修改
  int colEnd=nC;  //避免修改
  int nFlag=1;  //指定赋值方向:1向右 2向下 3向左 4向上
  
  while(1){
    int row=i;
    int col=j;
    
    if(nFlag==1){
      for(col=j;col        *(nArray+(row*nC)+col)=n;
        n++;
      }
      nFlag=2;
      i++;  
    }
    if(n>nR*nC)
      break;
    
    if(nFlag==2){
      col--;
      for(row=i;row        *(nArray+(row*nC)+col)=n;
        n++;
      }
      nFlag=3;
      colEnd--;
    }
    if(n>nR*nC)
      break;    
    if(colEnd<=1)
      break;
      
    if(nFlag==3){
      row--;
      for(col=colEnd-1;col>=j;col--){
        *(nArray+(row*nC)+col)=n;
        n++;
      }
      nFlag=4;
      rowEnd--;
    }
    if(n>nR*nC)
      break;  
    if(rowEnd<=1)
      break;
      
    if(nFlag==4){
      col++;
      for(row=rowEnd-1;row>=i;row--){
        *(nArray+(row*nC)+col)=n;
        n++;
      }
      nFlag=1;
      j++;
    }
    if(n>nR*nC)
      break;
  }
  
  //输出显示数组
  for(i=0;i    for(j=0;j      cout<<*(nArray+(i*nC)+j)<<"\t";
    cout<  }
  
  delete [] nArray;
  return 0;
}

发表评论