Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
这道打印矩阵的题以前遇到很多次,但写代码的时候还是有很多种情况没有考虑到,导致花费挺多时间。
题意:给定一个m*n的矩阵,从外围一层一层的打印出矩阵中的数据
思路:使用两个结点分别记录当前尚未访问到的矩阵的左上角和右下角的位置,根据两个结点的值可以访问到矩阵最外层的数据,然后让两个结点指向新的位置。
结束条件:假设记录矩阵访问信息的两个结点为a,b.则当a.x>=b.x 或者a.y>=b.y的时候应该结束。再者可以根据矩阵的大小信息,当m<n的时候两个结点会在横坐标方向相遇,当m>n的时候两个结点会在竖坐标方向相遇。
1 struct node 2 { 3 int x,y; 4 node(int _x,int _y):x(_x),y(_y){} 5 }; 6 7 vector<int> spiralOrder(vector<vector<int> > &matrix) { 8 // Start typing your C/C++ solution below 9 // DO NOT write int main() function 10 vector<int> data; 11 int m=matrix.size(); 12 if(m==0) 13 return data; 14 int n=matrix[0].size(); 15 if(n==0) 16 return data; 17 node a(0,0); 18 node b(m-1,n-1); 19 int e = m < n ? m : n; 20 e = e/2; 21 while(e--){ 22 for(int i=a.y;i<=b.y;i++) 23 data.push_back(matrix[a.x][i]); 24 for(int i=a.x+1;i<=b.x;i++) 25 data.push_back(matrix[i][b.y]); 26 for(int i=b.y-1;i>=a.y;i--) 27 data.push_back(matrix[b.x][i]); 28 for(int i=b.x-1;i>a.x;--i) 29 data.push_back(matrix[i][a.y]); 30 a.x++; 31 a.y++; 32 b.x--; 33 b.y--; 34 } 35 36 if(a.x==b.x) 37 { 38 for(int i=a.y;i<=b.y;i++) 39 data.push_back(matrix[a.x][i]); 40 }else if(a.y==b.y){ 41 for(int i=a.x;i<=b.x;i++) 42 data.push_back(matrix[i][a.y]); 43 } 44 return data; 45 }