【深基5.习6】蛇形方阵

题目描述

给出一个不大于 9的正整数n,输出n*n的蛇形方阵。

从左上角填上 1开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 3个字符,前面使用空格补齐。

输入格式

输入一个正整数 n,含义如题所述。

输出格式

输出符合题目要求的蛇形矩阵。

样例 #1

样例输入 #1

4

样例输出 #1

  1  2  3  4
12 13 14 5
11 16 15 6
10 9 8 7

提示

数据保证,1<=n<=9

我的代码

#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[n][n];
int top=0,down=n-1,left=0,right=n-1,count=1;
while(count<=n*n){
for (int i=left;i<=right;i++){
a[top][i]=count++;
}
top++;
for (int i=top;i<=down;i++){
a[i][right]=count++;
}
right--;
for (int i=right;i>=left;i--){
a[down][i]=count++;
}
down--;
for (int i=down;i>=top;i--){
a[i][left]=count++;
}
left++;
}
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}

我的解释

这道题的关键就在于如何控制程序按照蛇形生成count++的数字

我们让top和left=0,让down和right=n-1

这样就设置了上下左右四个边界

然后进入while这个循环,条件是count<=n*n,也就是要循环n*n次,把整个方阵的数字都打印完毕

接着看下面的四个for循环,每个循环都是分别用来控制上,右,下,左的边界并且在循环时为二维数组中填充蛇形

以第一个for循环为例,我详细的说明一下

for (int i=left;i<=right;i++){
   a[top][i]=count++;
}
top++;

首先循环i从left到right,这里遍历的是二维数组a的每一列,而固定的是a的行,由于是第一个for循环,打印的是上方的横的那一行,所以说行是固定的,且为top(上边界),然后随着i++和count++,就把二维数组上面的那一行填充完成了,循环结束后把top++,因为上边界一开始是0,我们需要把它向下移动一格,这样在下次循环的时候就可以填充第二行了。

ChatGPT的解释

当用于生成蛇形矩阵时,四个关键的 for 循环有不同的功能,它们一起协同工作来填充矩阵的元素值。让我逐个解释它们的作用:

  1. 第一个 for 循环:for (i = left; i <= right; ++i) {
       mat[top][i] = count++;
    }
    top++;这个循环负责填充矩阵的最上面一行,从左到右。leftright 标识了当前行的左右边界。count 用于给矩阵中的每个元素赋值,从1开始一直递增。填充完这一行后,top 被增加,表示我们已经处理了上方的行。
  2. 第二个 for 循环:for (i = top; i <= bottom; ++i) {
       mat[i][right] = count++;
    }
    right--;这个循环负责填充矩阵的最右边一列,从上到下。topbottom 标识了当前列的上下边界。同样地,count 递增并填充元素。填充完这一列后,right 减少,表示我们已经处理了右边的列。
  3. 第三个 for 循环:for (i = right; i >= left; --i) {
       mat[bottom][i] = count++;
    }
    bottom--;这个循环负责填充矩阵的最下面一行,从右到左。leftright 标识了当前行的左右边界。同样地,count 递增并填充元素。填充完这一行后,bottom 减少,表示我们已经处理了底部的行。
  4. 第四个 for 循环:for (i = bottom; i >= top; --i) {
       mat[i][left] = count++;
    }
    left++;这个循环负责填充矩阵的最左边一列,从下到上。topbottom 标识了当前列的上下边界。同样地,count 递增并填充元素。填充完这一列后,left 增加,表示我们已经处理了左边的列。

这四个 for 循环一起协同工作,不断地在矩阵中移动填充值,直到矩阵填充完毕。随着每个循环的迭代,对应边界的值会被更新,以便在下一个循环迭代时正确地填充下一行或列的值。

© 版权声明
THE END
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容