忍不住吐槽,
好久没有写算法类的代码了,感觉脑子有坑.
写逆时针矩阵用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 }