剑指offer29.顺时针打印矩阵

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.

完整代码

注意主函数中的vector定义的二维数组

#include

using namespace std;

    vector<int> printMatrix(vector<vector<int> > matrix) {
        int m,n,r=0,c=0,j,k=0,sum=0,i_f=0,j_f=0,s,s_r=1,s_c=0;
        //k,i_f,j_f用来控制打印这一行还是这一列,是从左往右打印还是从右往左打印
        //s_r,s_c用来控制倒着(从右往左,从下往上)打印时停止的行和列
        //r,c用来控制正着打印停止的行和列
        //s统计总的数字数,sum是当前打印了多少个数字
        vector<int> res;
        m=matrix.size();
        if (m==0)
            return res;
        n=matrix[0].size();
        s=m*n;
        while(sum<s){            
            if(k%2==0){//输出这一行
                if(j_f%2==0){//行+1
                    for(c;c<n;c++){
                        res.push_back(matrix[r][c]);
                        ++sum;
                    }
                    ++r;//输出完这一行,行数+1
                    --c;//列数置为有效值,刚刚循环里的c超出有效范围
                    --n;//下一次再打印从左往右的一行时,就去掉最后一列
                }
                else{//行-1
                    for(c;c>=s_c;c--){
                        res.push_back(matrix[r][c]);
                        ++sum;
                    }
                    --r;//输出完这一行,行数-1
                    ++c;//列数置为有效值
                    ++s_c;//修改起始地行
                }
                ++j_f;
            }
            else{//输出这一列
                if(i_f%2==0){//列+1
                    for(r;r<m;r++){
                        res.push_back(matrix[r][c]);
                        ++sum;
                    }
                    --c;
                    --r;
                    --m;
                }
                else{//列-1
                    
                    for(r;r>=s_r;r--){
                        res.push_back(matrix[r][c]);
                        ++sum;
                    }
                    ++c;
                    ++r;
                    ++s_r;
                }
                ++i_f;
            }
            ++k;
        }
        return res;
    }
int main(){
    vector<vector<int> > m(4);
    vector<int> res;
    int k=1;
    for(int i=0;i<4;i++){
        //m[i].resize(4);
        for(int j=0;j<4;j++){
            m[i].push_back(k);
            //m[i][j]=k;
            ++k;
        }
           
    }
    
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++)
            cout<<m[i][j]<<" ";
    }
    res=printMatrix(m);
    for(int i=0;i<16;i++){
        cout<<res[i]<<" ";
    }

    return 0;
}

思路和上述代码差不太多,只不过比上一个更清晰

#include

using namespace std;

    vector<int> printMatrix(vector<vector<int> > matrix) {
        int i,m,n,left=0,right,top=0,bottom;       
        vector<int> res;
        m=matrix.size();
        if (m==0)
            return res;
        n=matrix[0].size();
        right=n-1;
        bottom=m-1;
        while(left<=right&&top<=bottom){
            //从左到右打印一行
            for(i=left;i<=right;i++) 
                res.push_back(matrix[top][i]);
            //从上到下打印一行
            for(i=top+1;i<=bottom;i++)
                 res.push_back(matrix[i][right]);
            //从右到左打印一行
            if(top<bottom)//避免这一行值重复打印
            for(i=right-1;i>=left;i--) 
                res.push_back(matrix[bottom][i]);
            //从下到上打印一行
            if(left<right)//避免这一列值重复打印,例如:只有一列的情况[[1],[2],[3],[4],[5]]
            for(i=bottom-1;i>top;i--) 
                res.push_back(matrix[i][left]);
            
            ++left;
            --right;
            ++top;
            --bottom;
        }
        return res;
    }

int main(){
    vector<vector<int> > m(5);
    vector<int> res;
    int k=1;
    for(int i=0;i<5;i++){
        
       
            m[i].push_back(k);
            
            ++k;
        
           
    }
    cout<<endl;
    for(int i=0;i<5;i++){
        
            cout<<m[i][0]<<" ";
    }
    cout<<endl;
    res=printMatrix(m);
    for(int i=0;i<10;i++){//设置成10的原因在于:看看有没有多打印的元素
        cout<<res[i]<<" ";
    }

    return 0;
}

二刷
一圈一圈打印

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        //一圈一圈的打印
        int row = matrix.size();
        vector<int> res;
        if(row == 0)
            return res;
        int col = matrix[0].size();
        int cir = (row < col)? row : col;
        for(int i = 0; i < (cir + 1) / 2; ++i){
            printCircle(matrix, i, col - 2 * i, row - 2 * i, res);
        }
        return res;
    }
private:
    void printCircle(vector<vector<int>> matrix, int s, int s_c, int s_r, vector<int> &res){
        int i;
        //从左到右打印一行
        for(i = 0; i < s_c; ++i){
            res.push_back(matrix[s][s + i]);
        }
        //从上到下打印一列
        for(i = 0; i < s_r - 1; ++i){
            res.push_back(matrix[s + i + 1][s + s_c - 1]);
        }
        //从右到左打印一行
        if(s_r > 1)
        for(i = 0; i < s_c - 1; ++i){
            res.push_back(matrix[s + s_r - 1][s + s_c - 1 - i - 1]);
        }
        //从下到上打印一行
        if(s_c > 1)
        for(i = 0; i < s_r - 2; ++i){
            res.push_back(matrix[s + s_r - 1 - i - 1][s]);
        }
        
    }
};

你可能感兴趣的:(剑指offer,#,Vector,c++)