转圈打印矩阵

it2023-09-24  73

转圈打印矩阵

题目描述

给定一个整型矩阵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(""); }
最新回复(0)