class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix int整型vector<vector<>> 
     * @return int整型vector
     */
    vector<int> spiralOrder(vector<vector<int> >& matrix) {
        // write code here
        vector<int> ans;

        if(matrix.empty())
            return ans;

        int row = matrix.size();
        int col = matrix[0].size();

        int flag = 0;
        
        // 矩阵的上下左右边界;
        int height=0, low=row-1, left=0, right=col-1;

        for(int k=0; k<row*col;)
        {   
            // 0往右遍历
            if(flag%4==0)
            {
                int t = left;
                while(t<=right && k<row*col)
                {
                    ans.emplace_back(matrix[height][t++]);
                    ++k;
                }
                // 上边界遍历完了,下移
                ++height;
                // 改变遍历方向
                ++flag;
            }
            // 1往下遍历
            else if(flag%4==1)
            {
                int t = height;
                while(t<=low && k<row*col)
                {
                    ans.emplace_back(matrix[t++][right]);
                    ++k;
                }
                // 右边界遍历完了,左移
                --right;
                // 改变遍历方向
                ++flag;
            }
            // 2往左遍历
            else if(flag%4==2)
            {
                int t = right;
                while(t>=left && k<row*col)
                {
                    ans.emplace_back(matrix[low][t--]);
                    ++k;
                }
                // 下边界遍历完了,上移
                --low;
                // 改变遍历方向
                ++flag;
            }
            // 3往上遍历
            else if(flag%4==3)
            {
                int t = low;
                while(t>=height && k<row*col)
                {
                    ans.emplace_back(matrix[t--][left]);
                    ++k;
                }
                // 左边界遍历完了,右移
                ++left;
                // 改变遍历方向
                ++flag;
            }
        } 

        return ans;
    }
};