class Solution {
public:

    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        vector<int> res;
        int n = matrix.size();
        // 特断是否有元素存在,不存在直接返回res
        if(!n)
            return res;
        int m = matrix[0].size();
        if(!m)
            return res;
        // dx和dy分别代表向横坐标和纵坐标方向移动的幅度
        // 当遍历到边界的时候需要变一下方向
        int dx[4] = {0, 1, 0, -1};
        int dy[4] = {1, 0, -1, 0};
        // M 将遍历过得元素赋值为M表示走过了
        int M = INT_MAX - 1; 
        int k = 0;
        int i = 0, j = 0;
        // 必须先判断i和j是否已经出界,在判断matrix[i][j],否则会产生segment out错误
        // 当元素出界或是第二次遇到遍历过的元素,即为遍历到底
        while(i >=0 && i < n && j >= 0 && j < m && matrix[i][j] != M) {
            int x = matrix[i][j];
            matrix[i][j] = M;
            res.push_back(x);
            // 先判断三个边界条件
            if(i + dx[k] == n || j + dy[k] == m || j + dy[k] == -1)
                k = (k + 1) % 4;
            // 后判断前一个元素是否走过,如果走过需要变一下方向
            else if(matrix[i + dx[k]][j + dy[k]] == M)
                k = (k + 1) % 4;
            i = i + dx[k];
            j = j + dy[k];
        }

        return res;
    }
};