130. Surrounded Regions(被围绕的区域)

题目链接:https://leetcode.com/problems/surrounded-regions/

Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'.

A region is captured by flipping all 'O's into 'X's in that surrounded region.

Example:

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

After running your function, the board should be:

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

思路:

先沿着矩阵的四条边界来广度搜索哪个o是不被同化的,标记一下,后续根据这个标记处理即可。

class Solution {
    public void solve(char[][] board) {
        if(board.length==0||board[0].length==0)
            return;
        int m=board.length;
        int n=board[0].length;
        for(int i=0;i<m;i++){
            if(board[i][0]=='O')
                markToN(board,i,0);
            if(board[i][n-1]=='O')
                markToN(board,i,n-1);
        }
        for(int j=0;j<n;j++){
            if(board[0][j]=='O')
                markToN(board,0,j);
            if(board[m-1][j]=='O')
                markToN(board,m-1,j);
        }
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++){
                if(board[i][j]=='O')
                    board[i][j]='X';
                if(board[i][j]=='N')
                    board[i][j]='O';
            }
    }
    public void markToN(char[][] board,int i,int j){
        if(i<0||i>=board.length||j<0||j>=board[0].length||board[i][j]!='O')
            return;
        board[i][j]='N';
        markToN(board,i+1,j);
        markToN(board,i-1,j);
        markToN(board,i,j+1);
        markToN(board,i,j-1);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一种基于深度优先搜索(DFS)算法的解决方案,具体实现如下: ```lua -- 定义一个函数,用于判断某个元素所在的连通区域是否被其他连通区域完全包围 function is_surrounded(grid, row, col) -- 定义一个标记数组,用于记录每个元素是否已经被遍历过 local visited = {} for i = 1, #grid do visited[i] = {} for j = 1, #grid[i] do visited[i][j] = false end end -- 定义一个函数,用于执行深度优先搜索 local function dfs(r, c) -- 如果当前元素已经被遍历过,直接返回 if visited[r][c] then return end -- 标记当前元素为已遍历 visited[r][c] = true -- 如果当前元素位于边界上,说明它所在的连通区域没有被完全包围 if r == 1 or r == #grid or c == 1 or c == #grid[1] then return true end -- 递归遍历当前元素的上下左右四个方向 if dfs(r-1, c) or dfs(r+1, c) or dfs(r, c-1) or dfs(r, c+1) then return true end return false end -- 执行深度优先搜索,并返回结果 return dfs(row, col) end ``` 该函数接受三个参数:一个表示网格的二维数组 `grid`,一个表示元素所在行的索引 `row`,以及一个表示元素所在列的索引 `col`。函数首先创建一个和 `grid` 一样大小的标记数组 `visited`,并将其中所有元素初始化为 `false`。然后定义一个内部函数 `dfs`,用于执行深度优先搜索。该函数首先判断当前元素是否已经被遍历过,如果是则直接返回;否则将当前元素标记为已遍历,并检查当前元素是否位于边界上。如果是,则说明它所在的连通区域没有被完全包围,可以直接返回 `true`;否则递归遍历当前元素的上下左右四个方向,并将搜索结果作为返回值。最后,执行 `dfs(row, col)` 并返回其结果即可。 使用示例: ```lua -- 定义一个二维数组表示网格 local grid = { {1, 1, 1, 1}, {1, 0, 0, 1}, {1, 0, 0, 1}, {1, 1, 1, 1}, } -- 判断第二行第二列的元素所在的连通区域是否被其他连通区域完全包围 local surrounded = is_surrounded(grid, 2, 2) print(surrounded) -- 输出 false ``` 在上面的示例中,我们定义了一个二维数组 `grid` 表示一个 4x4 的网格,其中 1 表示障碍物,0 表示空地。然后调用 `is_surrounded(grid, 2, 2)` 函数,判断第二行第二列的元素所在的连通区域是否被其他连通区域完全包围。由于该连通区域没有被完全包围,因此返回值为 `false`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值