“之“字形打印矩阵

it2026-01-03  8

"之"字形打印矩阵

题目描述

给定一个矩阵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 ] ≤ 40000 ) matrix(1\leq matrix[i][j] \leq 40000) matrix(1matrix[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; }
最新回复(0)