/
//问题:将螺旋方阵放到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上通过!!