思路:就是一个模拟,跟紫书上那道蛇形矩阵一样,紫书讲的很好,首先模拟顺序是右下左上,用一个vis数组标记访问过的点,每次走之前需要先判断能不能走而不是先走,这样避免了越界问题。O(n*m)

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > e) {
        int cnt=1,x=0,y=0,n=e.size(),m=e[0].size();
        int vis[n+5][m+5];
        memset(vis,0,sizeof vis);
        vector<int>res;
        res.push_back(e[0][0]);
        vis[0][0]=1;
        while(1){
            if(cnt==n*m)break;
            while(y+1<m&&!vis[x][y+1]){
                y++;
                res.push_back(e[x][y]);
                vis[x][y]=1;
                cnt++;
            }
            while(x+1<n&&!vis[x+1][y]){
                x++;
                res.push_back(e[x][y]);
                vis[x][y]=1;
                cnt++;
            }
            while(y-1>=0&&!vis[x][y-1]){
                y--;
                res.push_back(e[x][y]);
                vis[x][y]=1;
                cnt++;
            }
            while(x-1>=0&&!vis[x-1][y]){
                x--;
                res.push_back(e[x][y]);
                vis[x][y]=1;
                cnt++;
            }

        }
        return res;
    }
};