题目描述
给出一个不大于 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
循环有不同的功能,它们一起协同工作来填充矩阵的元素值。让我逐个解释它们的作用:
- 第一个
for
循环:for (i = left; i <= right; ++i) {
mat[top][i] = count++;
}
top++;这个循环负责填充矩阵的最上面一行,从左到右。left
和right
标识了当前行的左右边界。count
用于给矩阵中的每个元素赋值,从1开始一直递增。填充完这一行后,top
被增加,表示我们已经处理了上方的行。 - 第二个
for
循环:for (i = top; i <= bottom; ++i) {
mat[i][right] = count++;
}
right--;这个循环负责填充矩阵的最右边一列,从上到下。top
和bottom
标识了当前列的上下边界。同样地,count
递增并填充元素。填充完这一列后,right
减少,表示我们已经处理了右边的列。 - 第三个
for
循环:for (i = right; i >= left; --i) {
mat[bottom][i] = count++;
}
bottom--;这个循环负责填充矩阵的最下面一行,从右到左。left
和right
标识了当前行的左右边界。同样地,count
递增并填充元素。填充完这一行后,bottom
减少,表示我们已经处理了底部的行。 - 第四个
for
循环:for (i = bottom; i >= top; --i) {
mat[i][left] = count++;
}
left++;这个循环负责填充矩阵的最左边一列,从下到上。top
和bottom
标识了当前列的上下边界。同样地,count
递增并填充元素。填充完这一列后,left
增加,表示我们已经处理了左边的列。
这四个 for
循环一起协同工作,不断地在矩阵中移动填充值,直到矩阵填充完毕。随着每个循环的迭代,对应边界的值会被更新,以便在下一个循环迭代时正确地填充下一行或列的值。
© 版权声明
若无特殊说明,文章版权归作者所有,请勿转载至任何平台。
THE END
暂无评论内容