剑指offer 20:顺时针打印矩阵

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
 

解题思路

此题为以矩阵中心为轴,顺时针输出一个数组,主要考察的点在于对最后一圈循环输出的边界条件把控。
将一圈顺时针输出定义为:
1.从左到右输出(上侧)
2.从上到下输出(右侧)
3.从右到左输出(下侧)
4.从下到上输出(左侧)
在正常的一圈中4步依次执行,但在最后一圈中2-4步可能只会执行其中个的一部分或不执行,需要根据此圈的形状进行判断。
 
C++代码实现:
class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> result;
        int row=matrix.size();
        if(row==0){
            return result;
           }
        int col=matrix[0].size();
        if(col==0){
            return result;
        }
        int  start=0;
        while(start*2<row && col>start*2){
            printCycle(matrix,result,row,col,start);
            start++;
        }
        return result;
        
    }
    void printCycle(const vector<vector<int> > & ori, vector<int> & result,int row,int col, int start){
        int endrow=row-start-1;
        int endcol=col-start-1;
        
        for (int i=start;i<=endcol;i++){//从左向右打印一行
            result.push_back(ori[start][i]);
        }
        if(endrow>start){
            for (int i=start+1;i<=endrow;i++){//从上到下打印一列
            result.push_back(ori[i][endcol]);
            }
        }
        if(endcol>start && endrow>start){
            for (int i=endcol-1;i>=start;i--){//从右向左打印一行
            result.push_back(ori[endrow][i]);
            }
        }
        if(endcol>start && endrow>start+1){
            for (int i=endrow-1;i>start;i--){//从右向左打印一行
            result.push_back(ori[i][start]);
            }
        }

    }
};
原文地址:https://www.cnblogs.com/fancy-li/p/11624049.html