Spiral Matrix

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.node

For example,
Given the following matrix:spa

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

You should return [1,2,3,6,9,8,7,4,5].code

这道打印矩阵的题之前遇到不少次,但写代码的时候仍是有不少种状况没有考虑到,致使花费挺多时间。blog

题意:给定一个m*n的矩阵,从外围一层一层的打印出矩阵中的数据element

思路:使用两个结点分别记录当前还没有访问到的矩阵的左上角和右下角的位置,根据两个结点的值能够访问到矩阵最外层的数据,而后让两个结点指向新的位置。it

结束条件:假设记录矩阵访问信息的两个结点为a,b.则当a.x>=b.x 或者a.y>=b.y的时候应该结束。再者能够根据矩阵的大小信息,当m<n的时候两个结点会在横坐标方向相遇,当m>n的时候两个结点会在竖坐标方向相遇。io

 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 }
相关文章
相关标签/搜索