对角线遍历
(1)对角线方向会发生改变
一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
(2)对角线方向不会改变
输入:1,2,3,4,5,6,7,8,9
输出:1,2,4,3,5,7,6,8,9
代码
#include <iostream>
#include <vector>
using namespace std;
//对角线的方向改变
vector<int> Matrix_diag_inv_order(vector<vector<int>>& matrix) {
vector<int> result;
int row = matrix.size();//矩阵行数
int col = matrix[0].size();//列数
//对角线条数与行列的关系:条数=行数+列数-1
for (int i = 0; i < row + col - 1; i++) {
//由于对角线的方向会发生改变,分为第奇数条对角线和第偶数条对角线
if (i % 2) {
//奇数条
//确定每条对角线的起始点
//当对角线条数超过列数时,即起始点的x坐标往下移动,由于i从0开始,即为i-col+1
int x = (i < col) ? 0 : (i - col + 1);
int y = (i < col) ? i : (col - 1);
while (x<row&&y>=0)
{
result.emplace_back(matrix[x][y]);
//沿左下方移动
x++;
y--;
}
}
else {
//偶数条
//确定每条对角线的起始点
//当对角线条数超过行数时,即起始点的y坐标向右移动,由于i从0开始,即为i-col+1
int x = (i < row) ? i : (row- 1);
int y = (i < row) ? 0 : (i-row + 1);
while (x>= 0 && y<col)
{
result.emplace_back(matrix[x][y]);
//沿右上方移动
x--;
y++;
}
}
}
return result;
}
//对角线方向都朝左下方
vector<int> Matrix_diag_order(vector<vector<int>>& matrix) {
vector<int> result;
int row = matrix.size();
int col = matrix[0].size();
for (int i = 0; i < row + col - 1; i++) {
int x = (i < col) ? 0 : (i - col + 1);
int y = (i < col) ? i : (col - 1);
while (x<row&& y >= 0) {
result.emplace_back(matrix[x][y]);
x++;
y--;
}
}
return result;
}
int main() {
vector<vector<int>> matrix = { {1, 3, 4, 6, 8},{6, 4, 2, 7, 5},{7, 4, 7, 2, 4} };
vector<int> result = Matrix_diag_inv_order(matrix);
vector<int> result1 = Matrix_diag_order(matrix);
cout << "对角线方向会变"<<endl;
for (int i = 0; i < result.size(); i++) {
cout << result[i] << ",";
}
cout << endl;
cout << "对角线方向不变" << endl;
for (int i = 0; i < result1.size(); i++) {
cout << result1[i] << ",";
}
cout << endl;
system("pause");
return 0;
}