转圈打印矩阵

转圈打印矩阵

题目描述

给定一个整型矩阵matrix,请按照顺时针转圈的方式打印它。

输入描述:

输入包含多行,第一行两个整数n和m ( 1 ≤ n , m ≤ 200 ) (1 \leq n,m \leq 200) (1n,m200),代表矩阵的行数和列数,接下来n行,每行m个整数,代表矩阵 m a t r i x ( 1 ≤ m a t r i x [ i ] [ j ] ≤ 1 0 5 ) matrix(1 \leq matrix[i][j] \leq 10^5) matrix(1matrix[i][j]105)

输出描述:

输出包含一行,n*m个整数,代表顺时针转圈输出的矩阵matrix。

示例1
输入
4 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
输出
1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
备注:

额外空间复杂度O(1)


题解:

蛇形矩阵打印有很多方法,无非是按照向右,向下,向左,向上的顺序模拟,一般解法需要额外使用一个数组记录每个位置是否被填充过。但此题要求额外空间复杂度为 O ( 1 ) O(1) O(1) ,上面的解法就不适用了。如何做呢?

我们可以使用左上角和右下角两个点来描述一个子矩阵,那么我们可以每次将子矩阵最外层打印,然后减小子矩阵,就这样层层剥开原矩阵即可。

代码:
#include <cstdio>

using namespace std;

const int N = 200;

int n, m;
int a[N][N];

int main(void) {
    scanf("%d%d", &n, &m);
    for ( int i = 0; i < n; ++i ) {
        for ( int j = 0; j < m; ++j )
            scanf ( "%d", a[i] + j );
    }
    int tot = n * m;
    int now = 0;
    int tr = 0, tc = 0;
    int dr = n - 1, dc = m - 1;
    while ( now < tot ) {
        for ( int i = tc; i <= dc; ++i ) {
            if ( now++ ) putchar( ' ' );
            printf("%d", a[tr][i]);
        }
        for ( int i = tr + 1; i <= dr; ++i ) {
            if ( now++ ) putchar( ' ' );
            printf("%d", a[i][dc]);
        }
        if ( tr < dr ) {
            for ( int i = dc - 1; i >= tc; --i ) {
                if ( now++ ) putchar( ' ' );
                printf("%d", a[dr][i]);
            }
        }
        if ( tc < dc ) {
            for ( int i = dr - 1; i > tr; --i ) {
                if ( now++ ) putchar( ' ' );
                printf("%d", a[i][tc]);
            }
        }
        ++tc, ++tr;
        --dc, --dr;
    }
    return 0 * puts("");
}
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页