题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
解析
一圈一圈向内靠近,每轮减少两行两列,最后处理剩余不足2行2列的情况
源码
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
| class Solution { public: typedef struct point{ int x; int y; }point; vector<int> printMatrix(vector<vector<int> > matrix) { int lenx,leny; vector<int> ans; lenx=matrix.size(); leny=matrix[0].size();
point p[4]; p[0].x=0; p[0].y=0; p[1].x=0; p[1].y=leny-1; p[2].x=lenx-1; p[2].y=leny-1; p[3].x=lenx-1; p[3].y=0; bool first=true; while(1){ if(first){ if(p[0].x==p[3].x&&p[0].y==p[3].y){ for(int i=p[0].y;i<=p[1].y;i++){ ans.push_back(matrix[p[0].x][i]); } break; } else if(p[0].x==p[1].x&&p[0].y==p[1].y){ for(int i=p[1].x;i<=p[2].x;i++){ ans.push_back(matrix[i][p[1].y]); } break; } } first=false; for(int i=p[0].y;i<p[1].y;i++){ ans.push_back(matrix[p[0].x][i]); } for(int i=p[1].x;i<p[2].x;i++){ ans.push_back(matrix[i][p[1].y]); } for(int i=p[2].y;i>p[3].y;i--){ ans.push_back(matrix[p[2].x][i]); } for(int i=p[3].x;i>p[0].x;i--){ ans.push_back(matrix[i][p[3].y]); } p[0].x++; p[0].y++; p[1].x++; p[1].y--; p[2].x--; p[2].y--; p[3].x--; p[3].y++; if(p[0].x>p[3].x||p[0].y>p[1].y){ break; } if(p[0].x==p[3].x&&p[0].y==p[3].y){ for(int i=p[0].y;i<=p[1].y;i++){ ans.push_back(matrix[p[0].x][i]); } break; } else if(p[0].x==p[1].x&&p[0].y==p[1].y){ for(int i=p[1].x;i<=p[2].x;i++){ ans.push_back(matrix[i][p[1].y]); } break; } } return ans; } };
|