计蒜客 | 矩阵蛇形输出

题目:

给定一个 m 行、n* 列的矩阵,请按照下图所示的顺序输出矩阵中所有的元素(从[0][0]位置开始,具体请参见下图)。
img
注意 每次碰到边界后,必须且只能沿着边界移动一格,不能后退,不能超出边界;在非边界区域只能向右上或左下方向前进。

输入格式

测评机会反复运行你写的程序。每次程序运行时,首先在第一行输入 2 个整数,分别对应题目描述中的 m 和 n(1 < m,n < 100),之间用一个空格分隔。接下来输入 m 行,每行包含 n 个整数(-10000 ≤ 每个数 ≤10000),每两个整数之间用一个空格分隔。

输出格式

输出为一行,包括 m × n 个整数,按照题目要求的顺序依次输出所有矩阵元素,任意两个整数之间用一个空格分隔,最后一个整数后面没有空格。

格式说明

输出时每行末尾的多余空格,不影响答案正确性

样例输入1

2 3
1 2 3
4 5 6

样例输出1

1 2 4 5 3 6

样例输入2

3 2
1 2
3 4
5 6

样例输出2

1 2 3 5 4 6

思路

简化题目

我们可以先把题目简化成这样:

它的实现方法:

#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;
}

(码风轻喷)
这里,我们忽略了边界,输出会是三角形,而不是矩形

回到原题

怎么能成为一个矩形呢?再加上限制条件就好啦

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

posted @ 2022-08-23 20:48  _天行九歌  阅读(152)  评论(0)    收藏  举报