Leetcode刷题笔记 130.被围绕的区域

130.被围绕的区域


时间:2020年8月11日
知识点:广搜、深搜
题目链接: https://leetcode-cn.com/problems/surrounded-regions/

题目
给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。

找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。

示例1
输入

X X X X
X O O X
X X O X
X O X X

输出

X X X X
X X X X
X X X X
X O X X

解释
被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

解法

  1. 与边缘的O相连的都不能被填充为X
  2. 遍历周围的O,去搜索和这个边缘O相连的所有的O,找最大区域块,标记这些O为不可填充
  3. 除了这些不可填充的O,其他都为X

代码

#include 
#include 
#include 
#include 
#include 
using namespace std;
struct node{
    int x,y;
    node(int x,int y){this->x = x,this->y = y;}
};
class Solution {
public:
    void solve(vector<vector<char>>& board) {
        int dirx[4] = {1,0,-1,0};
        int diry[4] = {0,1,0,-1};
        int m = board.size();
        if (m == 0) {
            return;
        }
        int n = board[0].size();
        //vector> visit(m,vector(n,0));
        queue<node> q;
        for (int i=0;i<m;i++) {
            if (board[i][0]=='O') {
                 q.push(node(i,0));
            }
            if (board[i][n-1]=='O') {
                q.push(node(i,n-1));
            }
        }
        for (int i=1;i<n-1;i++) {
            if (board[0][i]=='O') {
                 q.push(node(0,i));
            }
            if (board[m-1][i]=='O') {
                 q.push(node(m-1,i));
            }
        }
        while(!q.empty())
        {
            node tmp = q.front();
            q.pop();
            board[tmp.x][tmp.y]='S';
            for(int i=0;i<4;i++){
                int dx = tmp.x + dirx[i];
                int dy = tmp.y + diry[i];
                if(dx>=0&&dx<m&&dy>=0&&dy<n&&board[dx][dy]=='O')
                    q.push(node(dx,dy));
            }
        }
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if( board[i][j]=='S')
                    board[i][j] = 'O';
                else
                    board[i][j]='X';
            }
        }
        
        
    }
};
int main()
{
    vector<vector<char>> board(3,vector<char>(4));
    string str1 = "XXXX";
    board[0].assign(str1.begin(), str1.end());
    string str2 = "XOOX";
    board[1].assign(str2.begin(), str2.end());
    string str3 = "XXOX";
    board[2].assign(str3.begin(), str3.end());
    //string str4 = "XOXX";
    //board[3].assign(str4.begin(), str4.end());
    vector<vector<char>> board1(1,vector<char>(0));
    Solution s;
    s.solve(board);
    for(int i=0;i<board.size();i++){
        for (int j=0; j<board[i].size(); j++) {
            cout<<board[i][j];
        }
        cout<<endl;
    }
}

今天也是爱zz的一天哦!

你可能感兴趣的:(leetcode,leetcode,算法)