思想
使用四个指针 LR,LC,UR,UC
(LR,LC)是斜线最下方的坐标
(UR,UC)是斜线最上方的坐标
一个标记fromUP用来记录打印方向
当fromUP为true时,从上至下打印
反之,从下至上打印
每次打印之后fromUP取反
四个指针主要逻辑
int LR = 0, LC = 0;
int UR = 0, UC = 0;
bool fromUp = false;
while(UR != n){
zPrint(arr, LR, LC, UR, UC, fromUp);
LC = LR == n-1 ? LC+1 : LC;
LR = LR == n-1 ? LR : LR+1;
UR = UC == m-1 ? UR+1 : UR;
UC = UC == m-1 ? UC : UC+1;
fromUp = !fromUp;
}
相关阅读
旋转正方形矩阵
螺旋打印矩阵
Z字打印矩阵
行列排序矩阵找数
完整代码
#include <bits/stdc++.h>
using namespace std;
int **inputArr(int n, int m){
int **arr;
arr = new int* [n];
for(int i = 0; i < n; i++){
arr[i] = new int [m];
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> arr[i][j];
}
}
return arr;
}
void outputArr(int **arr, int n, int m){
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cout << arr[i][j] << " ";
}
cout << endl;
}
}
void zPrint(int **arr, int LR, int LC, int UR, int UC, bool fromUP){
if(fromUP){
while(UR <= LR){
cout << arr[UR++][UC--] << " ";
}
}else{
while(LR >= UR){
cout << arr[LR--][LC++] << " ";
}
}
}
int main(){
int **arr;
int n, m;
cin >> n >> m;
arr = inputArr(n, m);
int LR = 0, LC = 0;
int UR = 0, UC = 0;
bool fromUp = false;
while(UR != n){
zPrint(arr, LR, LC, UR, UC, fromUp);
LC = LR == n-1 ? LC+1 : LC;
LR = LR == n-1 ? LR : LR+1;
UR = UC == m-1 ? UR+1 : UR;
UC = UC == m-1 ? UC : UC+1;
fromUp = !fromUp;
}
cout << endl;
}