题解 | #蛇形矩阵#
蛇形矩阵
https://www.nowcoder.com/practice/f228a074c5274619b26be544962375e1
我称之为史上最简洁易懂方式,先看下面图形,图一是效果图,图二是我们分析的图,
我们通过分析,可以看出先打印第二张图是简单一点,通过补齐的方式行成一个三角形
这个三角形的行数通过观察发现是我们输入的行2倍-1 也就是2n-1 解决了循环的范围接着解决填充数字的条件。
当 行>=1 的时候我们需要填充数字,反之不填充,但我们每填充一次行减少1列增加1, n是我们输入的行,
#include<stdio.h> int main() { int n, arr[100][100] = { 0 }; scanf("%d", &n); int count = 1; for (int i = 1; i <= 2 * n - 1; i++) { int col = 1, row = i;//行和列从1开始,这里有伏笔,后面会讲到, while (row >= 1) { arr[row][col] = count++; row--, col++; } } for (int i = 1; i <= 2*n-1; i++) { for (int j = 1; j <= 2*n-1; j++) printf("%d ",arr[i][j]); printf("\n"); } return 0; }
这是我们已经有了雏形,三角形是可以的了,只不过分析图中的填充背景部分是不需要数字的,所以加一个条件,
在之前的 n>=1 填充里面加入条件:当行和列都<=n时候可以填充,其他不填充,这里提供一下条件代码,其他一致。
while (row >= 1) { if (row <= n && col <= n) arr[row][col] = count++; row--, col++; }
已经实现了我们最上面的分析图,但是和目标图还是不一样。我们现在实现全部的是从左下往右上的方式打印的
这里就使用到了前面的伏笔行和列从1开始的设定,通过观察我们发现基数行不用改变,偶数行是从右上往左下的,
而偶数行的下标实际上就是我们现在所处的位置下标对换。比如我们输入数字2的位置是 row=2 col=1 但实际我们要输出的是数字3 且 row=1 col =2 所以我们不难看出就是偶数行 则改变 row 和col 的位置,
while (row >= 1) { if (row <= n && col <= n) { if (i % 2 != 0)//基数行不变继续填充, arr[row][col] = count++; else//偶数行将行和列换位置, arr[col][row] = count++; } row--, col++;//每次填充完都行 }
效果已经出现了,
控制一下输出的行和列,让遍历到输入的n就好了,
如果看的不舒服可以稍加改动。
下面是完整代码。
#include<stdio.h> int main() { int n,arr[100][100]; scanf("%d",&n); int count=1; for(int i=1;i<=2*n-1;i++) { int col=1,row=i; while(row>=1) { if(col<=n&&row<=n) { if(i%2!=0) arr[row][col]=count++; else arr[col][row]=count++; } row--,col++; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) printf("%d ",arr[i][j]); printf("\n"); } return 0; }