【LeetCode130】被围绕的区域(dfs)

简介: m == board.lengthn == board[i].length

一、题目

image.png

提示:


m == board.length

n == board[i].length

1 <= m, n <= 200

board[i][j] 为 ‘X’ 或 ‘O’

二、思路

image.png

逆向思维:要把被X包围的所有O,都替换为X,就可以先把没被X包围的O找出来(这些O最后结果不会改变),可以通过遍历边界上的O,对其进行dfs找到这些O的连通分量。


你肯定会问,会不会有存在不是上面情况,并且没被X包围的呀——不存在的,不在边界O的连通分量,那自然是在“内部”了,即被X包围。


(1)从边界出发,先把边界上和O连通点找到,把这些变成A;

(2)然后遍历整个board把O变成X, 把B变成O。


三、代码

class Solution {
private:
    vector<pair<int,int>>directions{{0,1},{0,-1},{1,0},{-1,0}};
public:
    void solve(vector<vector<char>>& board) {
        int row=board.size();//row行数
        int col=board[0].size();//column列数
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(board[i][j]=='O' && (i == row-1 || j == col-1
                   || i == 0 || j == 0)){
                    dfs(board,i,j);
                }
            }
        }
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(board[i][j] == 'A'){
                    board[i][j] = 'O';
                }else if(board[i][j] == 'O'){
                    board[i][j] = 'X';
                }
            }
        }
    }
    void dfs(vector<vector<char>>&board,int x,int y){
        if(!isarea(board,x,y)){
            return;//如果坐标(x,y)超过网格范围,则直接返回
        }
        if(board[x][y]!='O'){
            return;//如果不是岛屿(1)则直接返回
        }
        board[x][y]='A';//将格子标记为已遍历过,重新淹水
        for(auto dir:directions){
            int newx=x+dir.first,newy=y+dir.second;
            if(isarea(board,newx,newy)){//在网格范围内(正常)
                //board[x][y]='X';
                dfs(board,newx,newy);
            }
        }
    }
    bool isarea(vector<vector<char>>&board,int x,int y){//判断点是否在网格内
        if(x>=0 && x<board.size() && 0<=y && y<board[0].size()){
            return true;
        }else{
            return false;
        }
    }  
};
相关文章
|
7月前
|
存储 算法 数据挖掘
python 数学+减治、下一个排列法、DFS回溯法实现:第 k 个排列【LeetCode 题目 60】
python 数学+减治、下一个排列法、DFS回溯法实现:第 k 个排列【LeetCode 题目 60】
|
7月前
|
算法
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
|
7月前
|
存储 SQL 算法
LeetCode题目100:递归、迭代、dfs使用栈多种算法图解相同的树
LeetCode题目100:递归、迭代、dfs使用栈多种算法图解相同的树
|
8月前
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
[leetcode~dfs]1261. 在受污染的二叉树中查找元素
|
8月前
|
算法 定位技术
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
83 0
|
存储 算法 C语言
【DFS】LeetCode 17. 电话号码的字母组合
看第一个示例:输入"23",其对应的是"abc"与"de".根据全排列的特点,我们先把它们按层状结构写开,之后依次排列组合即可
87 0
|
算法
从小白开始刷算法 dfs篇 leetcode.200
从小白开始刷算法 dfs篇 leetcode.200
Leetcode-每日一题1106. 解析布尔表达式(DFS模拟栈)
题目意思很简单让你去判断与或非布尔表达式的结果,我们可以看布尔表达式看成一棵树,需要我们解决的是从最底层的嵌套布尔表达式产生的结果不断向上的结果
121 1
Leetcode-每日一题1106. 解析布尔表达式(DFS模拟栈)
|
存储 算法
从小白开始刷算法 dfs篇 leetcode.938
从小白开始刷算法 dfs篇 leetcode.938
|
算法
从三道leetcode掌握深度优先搜索(DFS)
前言 无论在算法面试还是刷题中,深度优先搜索(DFS)和广度优先搜索(BFS)都是一个绕不过去的坎。不同于数组的从左至右遍历,循环常用于一维数据结构的遍历。而DFS和BFS则常用于多维数据结构的遍历,最常见的莫过于嵌套结构的多叉树了。