整个的循环过程可以分解成多个小过程来解决。
可以拿一个9*10的矩阵来举例子:
rowSize=9; colSize=10;
图片说明
具体可以分解为多少个环(过程)呢,取决于rowSize 和 colSize 的大小关系:
Pos = rowSize > colSize ? (colSize - 1) / 2 : (rowSize - 1) / 2;
Pos 代表共有多少个环(注:从0开始算)
从图中可以看出,第n个环的起始位置都是[n,n],n 最大为Pos。
将每个环的边界搞清楚之后就可以写出一个大循环,大循环过程中有4个小循环:

    for (int i = 0; i <= Pos; i++) {
        for() ...;    // 左上->右上
        for() ...;    // 右上->右下
        for() ...;    // 右下->左下
        for() ...;    // 左下->左上
    }

接下来判断特殊情况:严格意义上来说,像图中的9 * 10矩阵所描述的最后一“环”一样,他只是个横线,当然也会出现竖线。
横线和竖线的出现会导致重复打印。一条横线和竖线往往使用2 个小循环:左上->右上,右上->右下 就可以全部打印完。后面2 个小循环会重复打印,因此,后2 个小循环要加条件,避免重复。
最终代码如下:

vector<int> printMatrix(vector<vector<int> > matrix) {
    int rowSize = matrix.size();
    int colSize = matrix[0].size();
    vector<int> Temp;
    int Pos = rowSize > colSize ? (colSize - 1) / 2 : (rowSize - 1) / 2;
    for (int i = 0; i <= Pos; i++) {
        for (int c = i; c <= colSize - 1 - i; c++)
            Temp.push_back(matrix[i][c]);
        for (int r = i + 1; r <= rowSize - 1 - i; r++)
            Temp.push_back(matrix[r][colSize - 1 - i]);
        if (i != rowSize - 1 - i && i != colSize - 1 - i) {        // 添加判断条件:最后一环为单行或单列的情况下,不重复打印
            for (int c = colSize - 2 - i; c >= i; c--)
                Temp.push_back(matrix[rowSize - 1 - i][c]);
            for (int r = rowSize - 2 - i; r > i; r--)
                Temp.push_back(matrix[r][i]);
        }
    }
    return Temp;
}