顺时针打印矩阵

scorlw 发布于

顺时针打印矩阵

关键词:数组、循环

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:

1
2
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

1
2
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

思路

思路一:

首先要判断输入的数组是否合法;

设置数组的上下左右;

利用循环的方式,一层一层的对数组进行打印。

代码

思路一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int lw = 0, th = 0;//left-width top-height
int bh = matrix.size();//below-height
if(bh <= 0) return {};
int rw = matrix[0].size();//right-width
vector<int> res;
if(rw <= 0 || bh <= 0) return {};
while(rw > lw && bh > th){
for(int i = lw; i < rw; i++){//打印第一行
res.push_back(matrix[th][i]);
}
th++;//更改上边界
if(rw <= lw || bh <= th) break;//每次都要判断,防止非正方形矩阵的打印错误
for(int i = th; i < bh; i++){//打印最后一列
res.push_back(matrix[i][rw - 1]);
}
rw--;//更改右边界
if(rw <= lw || bh <= th) break;
for(int i = rw - 1; i >= lw; i--){//逆序打印最后一行
res.push_back(matrix[bh - 1][i]);
}
bh--;//更改下边界
if(rw <= lw || bh <= th) break;
for(int i = bh - 1; i >= th; i--){//逆序打印第一列
res.push_back(matrix[i][lw]);
}
lw++;//更改左边界
}
return res;
}
};

包含IO的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <vector>

using namespace std;
vector<int> spiralOrder(vector<vector<int> >& matrix)
{
int lw = 0, th = 0;//left-width top-height
int bh = matrix.size();//below-height
if(bh <= 0)
return {};
int rw = matrix[0].size();//right-width
vector<int> res;
if(rw <= 0 || bh <= 0)
return {};
while(rw > lw && bh > th)
{
for(int i = lw; i < rw; i++) //打印第一行
{
res.push_back(matrix[th][i]);
}
th++;//更改上边界
if(rw <= lw || bh <= th)
break;//每次都要判断,防止非正方形矩阵的打印错误
for(int i = th; i < bh; i++) //打印最后一列
{
res.push_back(matrix[i][rw - 1]);
}
rw--;//更改右边界
if(rw <= lw || bh <= th)
break;
for(int i = rw - 1; i >= lw; i--) //逆序打印最后一行
{
res.push_back(matrix[bh - 1][i]);
}
bh--;//更改下边界
if(rw <= lw || bh <= th)
break;
for(int i = bh - 1; i >= th; i--) //逆序打印第一列
{
res.push_back(matrix[i][lw]);
}
lw++;//更改左边界
}
return res;
}

int main()
{
int x = 0;
vector<vector<int>> vec;
vector<int> v;
while(cin >> x){
v.push_back(x);
if(cin.get() == '\n'){
vec.push_back(v);
break;
}
}
int len = v.size();
v.clear();
while(cin >> x){
v.push_back(x);
if(cin.get() == '\n'){
if(v.size() != len){
cout << "该行不符合矩阵要求,请重新输入" << endl;
v.clear();
continue;
}
else{
vec.push_back(v);
v.clear();
}

}
if(cin.peek() == '\n'){
vec.push_back(v);
break;
}
}
for(int i = 0; i < vec.size(); i++){
for(int j = 0; j < vec[0].size(); j++){
cout << vec[i][j] << " ";
}
}
cout << endl;
vector<int> res = spiralOrder(vec);
for(auto it = res.begin(); it != res.end(); it++){
cout << *it << " ";
}
cout << endl;
return 0;
}

知识点

  1. vector二维数组的定义;
  2. 循环条件的使用。
  3. cin.get()与cin.peek()的区别(都是读取当前输入,一个读完会清除掉,另一个不会)
  4. auto的使用,迭代器的使用。