我的螺旋矩阵解法!
2005-07-28 12:02
387 查看
/////////////////////////////////////////////////////////////
//问题:将螺旋方阵放到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上通过!!
//问题:将螺旋方阵放到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上通过!!
相关文章推荐
- 螺旋矩阵 解法
- 螺旋矩阵_动态规划解法
- 螺旋矩阵
- C语言经典题目螺旋矩阵
- 反螺旋矩阵
- 螺旋矩阵之第二篇
- 螺旋三角矩阵
- PHP实现螺旋矩阵(螺旋数组)
- B1050. 螺旋矩阵(25)
- 【LeetCode51-60】N皇后,和最大子串,螺旋矩阵,跳跳棋,合并区间,第K个全排列
- 1050. 螺旋矩阵(25)-PAT乙级
- Java程序练习-螺旋矩阵
- 1050. 螺旋矩阵(25)
- 螺旋矩阵
- PTA 7-9 螺旋方阵(20 分)简便解法与复杂解法
- (大神勿入)据说是一道面试题,然后自己就写了一发(矩阵的螺旋输出)
- 54.螺旋矩阵(Spiral Matrix)
- 矩阵迷宫 HihoCoder - 1702 DP解法
- PAT乙级1050 螺旋矩阵
- 矩阵顺时针螺旋输出2种不同的方法。