题目描述:按对角线方向打印矩阵
输入:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
输出:
1
2 5
3 6 9
4 7 10 13
8 11 14
12 15
16
思路:
输出稍微旋转一下可以发现每一行元素的横纵坐标之和相等
[0][0]
[1][0],[0][1]
[2][0],[1][1],[0][2]
……
[2][3],[3][2]
[3][3]
共row+col-1=7行,由于方阵,行=列,所以可以简化。
面试时候看出来规律了,但是陷入了一个死胡同想直接利用两个for循环的变量i和j输出nums[i][j]。
#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;
void slash(vector<vector<int>>& nums) {
if (nums.empty()) return ;
//for (int i = 0; i < nums.size(); i++) {
// cout << nums[i][0] << " ";
//}
int col = nums[0].size();
int row = nums.size();
//cout << col << " " << row << endl;
for (int i = 0; i < col + row -1; i++) {//层级
int level = i;//每层横纵坐标之和相等等于该层级
for (int j = 0; j < row; j++) {//每行的横坐标从0开始
int temp = level - j;//纵坐标
if (j >= 0 && j < row && temp >= 0 && temp < col) {//检查横纵坐标边界条件
cout << nums[j][temp] <<" ";
}
}
cout << endl;
}
}
void backslash(vector<vector<int>>& nums) {
if (nums.empty()) return;
int col = nums[0].size();
int row = nums.size();
for (int i = 0; i < row + col - 1; i++) {
int gap = col - i - 1;同一行的元素,行下标(横坐标)和列下标(纵坐标)的差相等
for (int j = 0; j < col; j++) {
int temp = j - gap;
if (temp >= 0 && temp < row && j >= 0 && j < col) {
cout << nums[temp][j] << " ";
}
}
cout << endl;
}
}
int main()
{
vector<vector<int>> nums = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 }};
slash(nums);
backslash(nums);
return 0;
}
结果: