"之"字形打印矩阵
题目描述
给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵,如样例所示。
输入描述:
输入包含多行,第一行包含两个整数n和m ( 1 ≤ n , m ≤ 200 ) (1 \leq n,m \leq 200) (1≤n,m≤200),代表矩阵的行数和列数,接下来n行,每行m个整数,代表矩阵 m a t r i x ( 1 ≤ m a t r i x [ i ] [ j ] ≤ 40000 ) matrix(1\leq matrix[i][j] \leq 40000) matrix(1≤matrix[i][j]≤40000)。
输出描述:
输出一行 ,代表“之”字形输出的矩阵。
示例1
输入
4 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
输出
1 2 5 9 6 3 4 7 10 13 14 11 8 12 15 16
备注:
额外空间复杂度 O ( 1 ) O(1) O(1)。
题解:
使用两个点维护每一条对角线,第一个点 (tr,tc) 从左上角开始,往右,往下移动;第二个点 (dr,dc) 从左上角开始,往下、往右移动,每次将两个点连线上的元素输出即可。
代码:
#include <cstdio>
using namespace std;
const int N = 200;
int n, m;
int a[N][N];
void print( int tr, int tc, int dr, int dc, bool &flag ) {
if ( flag ) {
while ( tr <= dr ) printf("%d ", a[tr++][tc--]);
} else {
while ( dr >= tr ) printf("%d ", a[dr--][dc++]);
}
}
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 tr = 0, tc = 0;
int dr = 0, dc = 0;
bool flag = false;
while ( tr < n ) {
print( tr, tc, dr, dc, flag );
tr += ( tc == m - 1 );
tc += ( tc != m - 1 );
dc += ( dr == n - 1 );
dr += ( dr != n - 1 );
flag = !flag;
}
return 0;
}
该篇博客介绍了如何按照‘之’字形的方式打印二维矩阵。代码使用C++编写,通过维护两个对角线上的点,分别进行左右下上移动,实现了额外空间复杂度为O(1)的解决方案。示例展示了对一个4x4矩阵的‘之’字形打印。
710

被折叠的 条评论
为什么被折叠?



