"之"字形打印矩阵
题目描述
给定一个矩阵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;
}