甘肃网站备案/河南省郑州市金水区
目录
- 实验7-2-9 螺旋方阵 (20分)
- 输入格式:
- 输出格式:
- 输入样例:
- 输出样例:
- 代码思路:
- 1.先尝试构造出外圈数字
- 2.发现规律找出共性,修改代码提高代码的通用性
- 3.测试完整代码
- 测试:
实验7-2-9 螺旋方阵 (20分)
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
输入样例:
5
输出样例:
1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9
代码思路:
1.先尝试构造出外圈数字
-
/*顺序: up-right-down-left1 2 3 4 516 0 0 0 615 0 0 0 714 0 0 0 813 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 = 1end=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 = 1end=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为最大数时,通过