顺时针打印矩阵

忍不住吐槽,

好久没有写算法类的代码了,感觉脑子有坑.

写逆时针矩阵用vector<vector<int>>做,(其实用数组也可以)

结果总是在边界出错.

往下走i是加,往左走i是减.

吐槽一下,真的是,全是坑,我说的是脑子

 1 //
 2 // Created by Arc on 2020/5/25.
 3 //
 4 /*
 5  * 把一个数字矩阵,按照瞬时针输出成另一个矩阵
 6  * 比如
 7  * 1 2 3
 8  * 4 5 6
 9  * 7 8 9
10  * 逆时针一下就是
11  * 1 2 3
12  * 6 9 8
13  * 7 4 5
14  *
15  * 
16  * */
17 #include <iostream>
18 #include<vector>
19 #include <math.h>
20 using  namespace std;
21 void spiralOrder(vector<vector<int>>& matrix){
22     /*判断是否为空*/
23     int m=matrix.size();
24     int n=matrix[0].size();
25     if(m == 0 || n == 0)
26         cout<<"0";
27     /*设置上下左右四个界限*/
28     vector<int> ans;
29     int top = 0;
30     int bottom = m - 1;
31     int left = 0;
32     int right = n - 1;
33     /*此算法模拟顺时针输出的过程,请联想打印过程*/
34     while(true)
35     {
36         /*1.top行从左到右遍历*/
37         for(int i=left;i<=right;i++){
38             ans.push_back(matrix[top][i]);
39 
40         }
41         /*top移动至下一行,并进行边界检测*/
42         top++;
43         if(top > bottom ) break;
44 
45         /*2.right列从上到下遍历*/
46         for(int i=top;i<=bottom;i++){
47             ans.push_back(matrix[i][right]);
48 
49 
50         }
51         /*right左移,并进行边界检测*/
52         right--;
53         if(right < left) break;
54 
55         /*3.bottom行从右往左遍历*/
56         for(int i = right;i>=left;i--){
57             ans.push_back( matrix[bottom][i]);
58 
59 
60         }
61         /*bottom行上移,并进行边界检测*/
62         bottom -- ;
63         if(bottom < top) break;
64         /*4.left列从下往上遍历*/
65         for(int i=bottom;i>=top;i--){
66             ans.push_back(matrix[i][left]);
67 
68             if(i==top)
69                 cout<<endl;
70         }
71         /*left右移,并进行边界检测*/
72         left++;
73         if(left > right) break;
74     }
75     /*返回遍历结果*/
76     int num=ans.size();
77     int sq=sqrt(num+1);
78     for(int i=0;i<num;i++){
79         cout<<ans[i];
80         if((i+1)%sq)
81             cout<<" ";
82         else cout<<endl;
83     }
84 }
85 int main() {
86     vector<vector<int>> array ={{1, 2, 3},{4, 5, 6},{7, 8, 9}};
87     spiralOrder(array);
88     return 0;
89 
90 }
原文地址:https://www.cnblogs.com/zhmlzhml/p/12958115.html