//顺时针
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        if(matrix.empty()) return res;
        int left=0,right=matrix[0].size()-1;
        int up=0,down=matrix.size()-1;
        while(true)
        {
            //左-》右
            for(int i=left;i<=right;i++) res.push_back(matrix[up][i]);
            if(++up>down) break;//重新设定边界条件
            //上-》下
            for(int i=up;i<=down;i++) res.push_back(matrix[i][right]);
            if(--right<left) break;
            //右-》左
            for(int i=right;i>=left;i--) res.push_back(matrix[down][i]);
            if(--down<up) break;
            //下-》上
            for(int i=down;i>=up;i--) res.push_back(matrix[i][left]);
            if(++left>right) break;
        }
        return res;
    }
};

//逆时针
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        if(matrix.empty()) return res;
        int left=0,right=matrix[0].size()-1;
        int up=0,down=matrix.size()-1;
        while(true)
        {
            //上-》下
            for(int i=up;i<=down;i++) res.push_back(matrix[i][left]);
            if(++left>right) break;
            //左-》右
            for(int i=left;i<=right;i++) res.push_back(matrix[down][i]);
            if(--down<up) break;//重新设定边界条件
            //下-》上
            for(int i=down;i>=up;i--) res.push_back(matrix[i][right]);
            if(--right<up) break;
            //右-》左
            for(int i=right;i>=left;i--) res.push_back(matrix[up][i]);
            if(++up>down) break;
        }
        return res;
    }
};

//蛇形
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        if(matrix.empty()) return res;
        int left=0,right=matrix[0].size()-1;
        int up=0,down=matrix.size()-1;
        while(true)
        {
            //左-》右
            for(int i=left;i<=right;i++) res.push_back(matrix[up][i]);
            if(++up>down) break;
            //
            for(int i=right;i>=left;i--) res.push_back(matrix[up][i]);
            if(++up>down) break;
            
        }
        return res;
    }
};