我的螺旋矩阵解法!

来源:互联网 发布:java实现的软件 编辑:程序博客网 时间:2024/05/18 00:53

/////////////////////////////////////////////////////////////
//问题:将螺旋方阵放到n*n的二唯数组中并把他打印输出,要求由程序自动生成下图所示螺旋方阵,
//  n由程序读入
//     1   16   15   14   13
//     2   17   24   23   12
//     3   18   25   22   11
//     4   19   20   21   10
//     5   6    7    8    9
//
//思路:观察方阵,找出规律
//  (1)设N=5,则每一外回个数为 N+N-1+N-1+n-2 = 4*N-4
//  (2)第i行的第i+1的数为4*N-4
//  (3)统一由N控制循环,当N>0是时,向下递增,向右递减
//  (4)这样就可以确定上三角,再由反对角线上的数确定剩下的数
//
//Write by: kejie
//date   : 2005-4-22
//
//欢迎有更好的意路提出大家讨论Thanks!
//
//
//
/////////////////////////////////////////////////////////////

#include <iostream.h>
#define Max 10

//先定义最大二维数组
static int A[Max][Max];

void CreateLou( int n)
{
 
 int i,j=1;
 int e=2; //e用于控制每列的递增数
 
 int M,k,l; //M用于记录N数,K用于每行递增数,l用于限制层数
 int row,col;//用于记录反对角线上的行,列上的数
 
 A[0][0]=1; //首先定义数组第1个元素为1
 M=l=n;  //传递n值给 M ,L,以以防改变N值
 
 k=4*M-4; //记录第1行第2个元素的值(计算公式,由图中规律观察得出)

 //外围while循环,次数由层数决定(一个回合为一层,比如当N=5时,1-16为第一层,
 //17-24为第二层)
 while (M>0)
 {
  
  //由for循环生成数组值,注意位置
  for(i=j;i<l;i++)
  {
   A[i][j-1] = e++;
   A[j-1][i] = k--;
  }
  
  //确定下一层的第1个值
  A[j][j] = A[j-1][j]+1;
  
  //下一层各个位置值设定
  e=A[j][j]+1; 
  M-=2;
  k=4*M-4+A[j][j]-1;
  
  j++;
 }
 
////////////////////////////
//以下为生成下三角数,方法与上面相同
 
 k=1;
 M=n;
 while (k<=M/2)
 {
  row = A[M-k][k-1];
  col = A[k-1][M-k];
  
  for(i=k;i<M-k+1;i++)
  {
   A[n-k][i] = ++row;
   A[i][n-k] =--col;
  }
  k++;
  
 }
 
 //最后输出N维螺旋数组~~
 for(i=0;i<n;i++)
 {
  for(j=0;j<n;j++)
   cout<<A[i][j]<<" ";
  cout<<endl;
 }
}
int main()
{
 int n;
 do {
 cout<<"Please input N(less than 10):";
 cin>>n;
 
 }while (n>10);
 
 CreateLou(n);


  return 0;
}

---------------------------

本程序在XP+SP2, VC++6.0上通过!!