顺时针打印矩阵

来源:互联网 发布:足球球员数据统计表格 编辑:程序博客网 时间:2024/05/21 17:57

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

class Solution {public:    vector<int> printMatrix(vector<vector<int> > matrix) {        int row,col,num,cnt=0;        vector<int> res;        row=matrix.size();        col=matrix[0].size();        num=row*col;        for(int cir=0;cir<(row+1)/2;++cir){            for(int i=cir;i<col-cir;++i){                if(cnt==num)                    break;                ++cnt;                res.push_back(matrix[cir][i]);            }            for(int i=cir+1;i<row-1-cir;++i){                if(cnt==num)                    break;                ++cnt;                res.push_back(matrix[i][col-cir-1]);            }            for(int i=col-1-cir;i>=cir;--i){                if(cnt==num)                    break;                ++cnt;                res.push_back(matrix[row-1-cir][i]);            }            for(int i=row-2-cir;i>cir;--i){                if(cnt==num)                    break;                ++cnt;                res.push_back(matrix[i][cir]);            }        }        return res;    }};

PAT乙级里编过B1050,可以直接在我博客里搜。
因为我的方法不是最简单的。。。。所以下面我贴出前辈简洁点的代码。

//上地class Solution {public:    vector<int> printMatrix(vector<vector<int> > matrix) {        int row = matrix.size();        int col = matrix[0].size();        vector<int> res;        // 输入的二维数组非法,返回空的数组        if (row == 0 || col == 0)  return res;        // 定义四个关键变量,表示左上和右下的打印范围        int left = 0, top = 0, right = col - 1, bottom = row - 1;        while (left <= right && top <= bottom)        {            // left to right            for (int i = left; i <= right; ++i)  res.push_back(matrix[top][i]);            // top to bottom            for (int i = top + 1; i <= bottom; ++i)  res.push_back(matrix[i][right]);            // right to left            if (top != bottom)            for (int i = right - 1; i >= left; --i)  res.push_back(matrix[bottom][i]);            // bottom to top            if (left != right)            for (int i = bottom - 1; i > top; --i)  res.push_back(matrix[i][left]);            left++,top++,right--,bottom--;        }        return res;    }};

使用left这类数据来判断循环是否结束,比我的cnt不知道高到哪里去。
而且if (top != bottom)这两句的知识水平非常高。

0 0
原创粉丝点击