深度优先搜索练习三

例题一:被围绕的区域

给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。

示例 1:

输入:board = [[“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’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。

示例 2:

输入:board = [[“X”]]
输出:[[“X”]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/surrounded-regions

分析:

将被包围的o换为x;

标记没被包围的o,剩下的就是被包围的o;

没被包围的o,必有一个在边界,所以从四个边界开始做深度优先

class Solution {
    public void solve(char[][] board) {
        int row = board.length;
        int col = board[0].length;
        int[][] dir = {{-1,0},{0,1},{1,0},{0,-1}};
        //左右边界
        for(int i=0;i<row;i++){
            if(board[i][0]=='O')
                dfs(board,i,0,dir);
            if(board[i][col-1]=='O')
                dfs(board,i,col-1,dir);
        }
        //上下边界
        for(int i = 1;i<col-1;i++){
            if(board[0][i]=='O')
                dfs(board,0,i,dir);
            if(board[row-1][i]=='O')
                dfs(board,row-1,i,dir);
        }
		/
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(board[i][j]=='Y')
                    board[i][j]='O';
                else if(board[i][j]=='O')
                    board[i][j]='X';
            }
        }
    }
    private void dfs(char[][] board,int x,int y,int[][] dir){
        if(x<0||x>=board.length || y<0||y>=board[0].length || board[x][y]!='O')
            return ;
        board[x][y] = 'Y';
        for(int[] a : dir){
            int newx = x+a[0];
            int newy = y+a[1];
            dfs(board,newx,newy,dir);
        }
    }
}

例题二:岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands例 1:

输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1

思路:dfs

class Solution {
    public int numIslands(char[][] grid) {
        int row = grid.length;
        int col = grid[0].length;
        int[][] dir = {{-1,0},{0,1},{1,0},{0,-1}};
        int count = 0;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(grid[i][j]=='1'){
                    dfs(grid,i,j,dir);
                    count++;
                }
            }
        }
        return count;
    }
    private void dfs(char[][] grid,int x,int y,int[][] dir){
        if(x<0||x>=grid.length || y<0||y>=grid[0].length || grid[x][y]!='1')
        return;
        grid[x][y] = '0';
        for(int[] a : dir){
            int newx = x+a[0];
            int newy = y+a[1];
            dfs(grid,newx,newy,dir);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值