题解 | #顺时针打印矩阵#

顺时针打印矩阵

https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a

#include <vector>
class Solution {
    //注意:给的矩阵不一定是方阵!
  public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        //matrix.size()行数;matrix[0].size()列数
        int rows = matrix.size();
        int cols = matrix[0].size();
        vector<int> res;
        if (matrix[0].size() == 0  ) {
            return res;
        }
        if (matrix[0].size() == 1 && matrix.size() == 1) {
            res.push_back(matrix[0][0]);
            return res;
        }
        //flag:墙壁和记录路径
        //1 1 1 1 1     matrix
        //1 0 0 0 1     1 2 3
        //1 0 0 0 1     4 5 6
        //1 0 0 0 1     7 8 9
        //1 1 1 1 1
        vector<vector<bool>>flag(rows + 2, vector<bool>(cols + 2, true));
        for (int i = 1; i <= rows; i++) {
            for (int j = 1; j <= cols; j++) {
                flag[i][j] = false;
            }
        }

        int row = 0;
        int col = 0;

        while (true) {

            //right
            while (true) {
                if (flag[row + 1][col + 1] == false)   res.push_back(matrix[row][col]);
                flag[row + 1][col + 1] = true;
                //check right side
                if (flag[row + 1][col + 2] == true) break;
                col++;
            }

            //down
            while (true) {
                if (flag[row + 1][col + 1] == false)   res.push_back(matrix[row][col]);
                flag[row + 1][col + 1] = true;
                //check down side
                if (flag[row + 2][col + 1] == true)   break;
                row++;
            }

            //left
            while (true) {
                if (flag[row + 1][col + 1] == false)   res.push_back(matrix[row][col]);
                flag[row + 1][col + 1] = true;
                //check left side
                if (flag[row + 1][col] == true)   break;
                col--;
            }

            //up
            while (true) {
                if (flag[row + 1][col + 1] == false)   res.push_back(matrix[row][col]);
                flag[row + 1][col + 1] = true;
                //check up side
                if (flag[row][col + 1] == true)   break;
                row--;
            }

            //end 如果四周都走过了,就结束
            if (flag[row + 2][col + 1] && flag[row + 1][col + 2] &&
                    flag[row ][col + 1] && flag[row + 1][col]) {
                if (flag[row + 1][col + 1] == false)   res.push_back(matrix[row][col]);
                flag[row + 1][col + 1] = true;
                break;
            }
        }


        return res;

    }
};

全部评论

相关推荐

06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-21 13:38
8月实习会变多吗现在还没找到实习该怎么办...回复的hr好少
码农索隆:3-4月就要开始找,基本上6月份就发offer,7月初已经开始暑期实习了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务