class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        vector<int> res;
        int m = matrix.size();
        if(m == 0) return res;
        int n = matrix[0].size();
        int nRows = m;
        int nCols = n;

        int tmpR, tmpC;
        for(;m > 0 && n > 0 && res.size() < nRows*nCols;m--,n--)
        {
            tmpR = nRows - m;
            tmpC = nCols-n;
            //从左至右
            for(;tmpC < n && tmpR < m; tmpC++)
                res.push_back(matrix[tmpR][tmpC]);
            //从上至下
            tmpC = n - 1;
            tmpR = nRows - m + 1;
            for(;tmpR < m && tmpC >= 0; tmpR++)
                res.push_back(matrix[tmpR][tmpC]);
            //从右向左
            tmpR = m - 1;
            tmpC = n - 2;
            for(;tmpC >= (nCols - n) && tmpR > (nRows - m); tmpC--)
                res.push_back(matrix[tmpR][tmpC]);
            //从下至上
            tmpC = nCols - n;
            tmpR = m - 2;
            for(;tmpR >= (nRows - m) + 1 && tmpC < (n - 1); tmpR--)
                res.push_back(matrix[tmpR][tmpC]);
        }
        return res;
    }
};