矩阵蛇形输出

题目

矩阵蛇形输出

给定一个 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
3
2 3
1 2 3
4 5 6

样例输出1

1
1 2 4 5 3 6

样例输入2

1
2
3
4
3 2
1 2
3 4
5 6

样例输出2

1
1 2 3 5 4 6

思路

简化题目

我们可以先把题目简化成这样:
img
它的实现方法:

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了,很简洁!


矩阵蛇形输出
https://asxjdb.github.io/2023/06/07/矩阵蛇形输出/
作者
Asxjdb
发布于
2023年6月7日
许可协议