Leetcode-搜索-130.被围绕的区域(中等)

本文详细解析了“被围绕的区域”问题的两种解决方法:深度优先搜索(DFS)和广度优先搜索(BFS)。通过DFS从边界开始递归地标记不会被改变的元素,而BFS则使用队列进行层次遍历。最后比较了两种方法的时间和空间效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目如下

在这里插入图片描述

解题思路

不被包围的肯定有一边在边界,所以我们从边界遍历,边界遍历可以碰到的0是不会被改变的,里面遍历不到的说明肯定被包围了
1.深度优先搜索,就是深搜,从边界往四个方向递归
2.广度优先搜索,就是广搜,边界遇到0了先压到队列里面,之后从队列里面来进行判断

dfs-c++代码(深搜)

class Solution {
public:
    int n;
    int m;
    void dfs(vector<vector<char>>& board, int x, int y)
    {   //返回条件,越界,或者是X或者#
        if(x<0 || x>=n || y<0 || y>=m || board[x][y] != 'O'){
            return;
        }
        board[x][y] = '#';//标记
        dfs(board,x+1,y);//右
        dfs(board,x,y+1);//上
        dfs(board,x-1,y);//左
        dfs(board,x,y-1);//下
    }
    void solve(vector<vector<char>>& board) {   //找到被围起来的o变成x,和边界相连的O就是不用变的        
        n = board.size();//行数
        if(n == 0)return;//空的
        m = board[0].size();//列数
        for(int i=0;i<n;i++){
            dfs(board,i,0);//第一列
            dfs(board,i,m-1);//最后一列
        }
        for(int i=0;i<m;i++){
            dfs(board,0,i);//第一行
            dfs(board,n-1,i);//最后一行
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(board[i][j] == '#'){
                    board[i][j] = 'O';
                }
                else if(board[i][j] == 'O'){
                    board[i][j] = 'X';
                }
            }
        }
    }
};

bfs-c++代码(广搜)

class Solution {
public:
    const int dx[4] = {1, -1, 0, 0};
    const int dy[4] = {0, 0, 1, -1};
    void solve(vector<vector<char>>& board) {
        int n = board.size();
        if (n == 0) {
            return;
        }
        int m = board[0].size();
        queue<pair<int, int>> que;
        for (int i = 0; i < n; i++) {
            if (board[i][0] == 'O') {
                que.emplace(i, 0);
            }
            if (board[i][m - 1] == 'O') {
                que.emplace(i, m - 1);
            }
        }
        for (int i = 1; i < m - 1; i++) {
            if (board[0][i] == 'O') {
                que.emplace(0, i);   
            }
            if (board[n - 1][i] == 'O') {
                que.emplace(n - 1, i);
            }
        }
        while (!que.empty()) {
            int x = que.front().first, y = que.front().second;
            que.pop();
            board[x][y] = 'A';
            for (int i = 0; i < 4; i++) {
                int mx = x + dx[i], my = y + dy[i];
                if (mx < 0 || my < 0 || mx >= n || my >= m || board[mx][my] != 'O') {
                    continue;
                }
                que.emplace(mx, my);
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (board[i][j] == 'A') {
                    board[i][j] = 'O';
                } else if (board[i][j] == 'O') {
                    board[i][j] = 'X';
                }
            }
        }
    }
};

提交对比

在这里插入图片描述
可以看出:
bfs(广度搜索更快,但是内存消耗更多)
dfs(深度搜索内存消耗更少,但是相对慢些)
这就是以时间换空间,以空间换时间!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值