实验7-2-9 螺旋方阵 (20分)
程序员文章站
2022-03-04 22:37:22
...
目录
实验7-2-9 螺旋方阵 (20分)
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
输入样例:
5
输出样例:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
代码思路:
1.先尝试构造出外圈数字
-
/* 顺序: up-right-down-left 1 2 3 4 5 16 0 0 0 6 15 0 0 0 7 14 0 0 0 8 13 12 11 10 9 */ #include <stdio.h> #define N 10 int main() { int i,j,k,n,a[N][N]={0},value=1; scanf("%d",&n); //up for(j=0;j<n;j++) { a[0][j]=value++; } //right for(i=1;i<n;i++) { a[i][n-1]=value++; } //down for(j=n-2;j>=0;j--) { a[n-1][j]=value++; } //left for(i=n-2;i>0;i--) { a[i][0]=value++; } for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%3d ",a[i][j]); printf("\n"); } return 0; }
2.发现规律找出共性,修改代码提高代码的通用性
-
成功输出,可以发现某些规律
-
外圈
- 输出完外圈后里面是一个3*3的矩阵,里面的矩阵输出步骤重复。故可以使用一个变量k来控制重复的次数k=n , k=k-2; 循环结束条件为k>1
- 分就奇偶讨论,当k为奇数时,矩阵中间点要单独计算
-
内圈
-
每次外圈循环完后,变成更小的矩阵,每条边的上下限不是常量,是一个变量且变化规律是内缩一格
-
//改造代码 int k,start,end; //分别表示外圈循环标记,起始和末尾 k=n; start=0; end=n; // while(k>1){ //up 举列 把所有的与边界值有关替换为start和end控制 for(j=start;j<end;j++) { a[start][j]=value++; } //right for(i=start+1;i<end;i++) { a[i][end-1]=value++; } //down for(j=end-2;j>=start;j--) { a[end-1][j]=value++; } //left for(i=end-2;i>start;i--) { a[i][start]=value++; } //如果n为奇数则,为矩阵中间数赋值 if(n%2) a[start][end-1]=value; k=k-2; //控制外圈变量 5阶矩阵只做2次循环 5 3 1就结束 //边界需要缩进一格 start=start+1; //0+1 = 1 end=end-1; //(n-1)-1 = n-2 }
-
3.测试完整代码
#include <stdio.h>
#define N 10
int main()
{
int i,j,n,a[N][N]={0},value=1;
scanf("%d",&n);
//改造代码
int k,start,end; //分别表示外圈循环标记,起始和末尾
k=n;
start=0;
end=n;
while(k>1){
//up 举列 把所有的与边界值有关替换为start和end控制
for(j=start;j<end;j++)
{
a[start][j]=value++;
}
//right
for(i=start+1;i<end;i++)
{
a[i][end-1]=value++;
}
//down
for(j=end-2;j>=start;j--)
{
a[end-1][j]=value++;
}
//left
for(i=end-2;i>start;i--)
{
a[i][start]=value++;
}
//控制外圈变量 5 3 1 结束
k=k-2;
//边界需要缩进一格
start=start+1; //0+1 = 1
end=end-1; //(n-1)-1 = n-2
}
//如果n为奇数则,为矩阵中间数赋值
if(n%2)
a[start][end-1]=value;
for(i=0;i<n;i++)
{
printf("%3d",a[i][0]);
for(j=1;j<n;j++)
printf("%3d",a[i][j]);
printf("\n");
}
return 0;
}
测试:
- n==1时,通过
- n==3 为奇数时,通过
- n==5 为测试点时,通过
- n==4 为偶数时,通过
- n==10为最大数时,通过