本文最后更新于 2023-09-17T14:23:56+08:00
题目
矩阵蛇形输出
给定一个 m 行、n* 列的矩阵,请按照下图所示的顺序输出矩阵中所有的元素(从[0][0]
位置开始,具体请参见下图)。
注意 每次碰到边界后,必须且只能沿着边界移动一格,不能后退,不能超出边界;在非边界区域只能向右上或左下方向前进。
输入格式
测评机会反复运行你写的程序。每次程序运行时,首先在第一行输入 22 个整数,分别对应题目描述中的 mm 和 nn(1 \leq m,n \leq 1001≤m,n≤100),之间用一个空格分隔。接下来输入 mm 行,每行包含 nn 个整数(-10000 \leq−10000≤ 每个数 \leq 10000≤10000),每两个整数之间用一个空格分隔。
输出格式
输出为一行,包括 m\times nm×n 个整数,按照题目要求的顺序依次输出所有矩阵元素,任意两个整数之间用一个空格分隔,最后一个整数后面没有空格。
格式说明
输出时每行末尾的多余空格,不影响答案正确性
样例输入1
样例输出1
样例输入2
样例输出2
思路
简化题目
我们可以先把题目简化成这样:
它的实现方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include<stdio.h>
int main() { int num[110][110], i, j, k; int m, n; scanf("%d %d", &m, &n);
for (i = 0; i < m; i++) for (j = 0; j < n; j++) scanf("%d", &num[i][j]);
for (i = 0; i < m + n; i++) { for (j = 0; j <= i; j++) printf("%d ", num[i-j][j]); i++; for (j = 0; j <= i; j++) printf("%d ", num[j][i-j]); }
return 0; }
|
(码风轻喷)
这里,我们忽略了边界,输出会是三角形,而不是矩形
回到原题
怎么能成为一个矩形呢?再加上限制条件就好啦
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include<stdio.h>
int main() { int num[110][110], i, j, k; int m, n; scanf("%d %d", &m, &n);
for (i = 0; i < m; i++) for (j = 0; j < n; j++) scanf("%d", &num[i][j]);
for (i = 0; i < m + n; i++) { for (j = 0; j <= i; j++) if(j < n && i - j < m ) printf("%d ", num[i-j][j]); i++; for (j = 0; j <= i; j++) if(j < m && i - j < n) printf("%d ", num[j][i-j]); }
return 0; }
|
这道题就成功ac了,很简洁!