简单dfs(两个例题 中等 中等)

例题 一 :岛屿数量(力扣 200 中等)

题目链接:

200. 岛屿数量 - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=M1H3https://leetcode-cn.com/problems/number-of-islands/

题目:给你一个由'1'(陆地)和'0'(水)组成的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [

        [ "1", "1", "1", "1", "0"],

        [ "1", "1", "0", "1", "0"],

        [ "1", "1", "0", "0", "0"],

        [ "0", "0", "0", "0", "0"]

]

输出:

示例 2:

输入:grid = [

        [ "1", "1", "0", "0", "0"],

        [ "1", "1", "0", "0", "0"],

        [ "0", "0", "1", "0", "0"],

        ["0", "0", "0", "1", "1"]

]

输出:

提示:

  • m == grid.length
  • n  == grid[i].length
  • 1 <= m, n <= 300
  • gride[i][j]的值为'0'或'1' 

题目分析:题目的意思可以理解为统计连续(上下左右相邻)的'1'的个数,可以先找到'1',然后通过dfs将‘1’附近的‘1’改为‘0’,并计数。

代码:

class Solution {
public:
    void dfs(vector<vector<char>>& nums, int x, int y)
    {
        int n = nums.size(), m = nums[0].size();
        if(x < 0 || y < 0 || x >= n || y >= m || nums[x][y] == '0')   return;
        nums[x][y] = '0';
        dfs(nums, x - 1, y), dfs(nums, x + 1, y), dfs(nums, x, y - 1), dfs(nums, x, y + 1);
    }
    int numIslands(vector<vector<char>>& grid) {
        int cnt = 0, n = grid.size(), m = grid[0].size();
        for(int i = 0; i < n; i ++)
            for(int j = 0; j < m; j ++)
            {
                if(grid[i][j] == '1')
                {
                    cnt ++;
                    dfs(grid, i, j);
                }
            }
        return cnt;
    }
};

 

例题 2:被围绕的区域(力扣 130  中等)

题目链接:130. 被围绕的区域 - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=M1H3https://leetcode-cn.com/problems/surrounded-regions/

题目:给你一个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"]]

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 200
  • board[i][j]为'X'或'O' 

题目分析:将除边缘附近(上下左右相邻)的'O'改为‘X’,对边缘的'O'进行dfs,将其相邻的'O'改为‘A’(这里任选,除‘X’和‘O’外都可以),然后通过循环将'O'改为‘X’,将‘A’改为‘O’,这里的先后顺序不能更改。

代码:

class Solution {
public:
    void dfs(vector<vector<char>>& board, int x, int y)
    {
        int n = board.size(), m = board[0].size();
        if(x < 0 || y < 0 || x >= n || y >= m || board[x][y] != 'O')    return;
        board[x][y] = 'A';
        dfs(board, x, y + 1), dfs(board, x, y - 1), dfs(board, x- 1, y), dfs(board, x + 1, y);
    }
    void solve(vector<vector<char>>& board) {
        int n = board.size(), m = board[0].size();
        for(int i = 0; i < n; i ++)
        {
            if(board[i][0] == 'O')
                dfs(board, i, 0);
            if(board[i][m - 1] == 'O')
                dfs(board, i, m - 1);
        }
        for(int i = 0; i < m; i ++)
        {
            if(board[0][i] == 'O')
                dfs(board, 0, i);
            if(board[n - 1][i] == 'O')
                dfs(board, n - 1, i);
        }    
        for(int i = 0; i < n; i ++)
        {
            for(int j = 0; j < m; j ++)
                if(board[i][j] == 'O')
                    board[i][j] = 'X';
        }
        for(int i = 0; i < n; i ++)
            for(int j = 0; j < m; j ++)
                if(board[i][j] == 'A')
                    board[i][j] = 'O';
        
    }
};

 

总结:

大部分的dfs的模板

void dfs(vector<vector<int>>& nums, int x, int y)
{
    int n = nums.size(), m = nums[0].size();
    if( x < 0 || y < 0 || x >= n || y >= m ||   }    return;
    
    dfs(nums, x - 1, y), dfs(nums, x + 1, y), dfs(nums, x, y - 1), dfs(nums, x, y + 1);
}

 一般简单的dfs是通过递归的方式对二位数组进行改变。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 高通联机修改串码、MEID码等参数软件DFS两个版本,下面将为大家提供一些关于这两个版本的视频教程。 首先是DFS版本2.8.0.6的视频教程。DFS是一款功能强大的高通联机修改软件,可以帮助用户修改手机的一些参数。在这个视频教程中,我们将介绍DFS软件的安装步骤、界面介绍以及一些常用操作方法。通过观看这个视频教程,您将能够了解DFS软件的基本使用方法,以及如何修改手机的串码、MEID码等参数。 其次是DFS版本17.10.02的视频教程。这个版本的DFS软件在功能上有所更新和改进,相比于之前的版本更加强大和稳定。在这个视频教程中,我们将详细介绍DFS 17.10.02软件的安装和使用方法,包括界面介绍、参数修改操作等。通过观看这个视频教程,您将能够更加深入地了解DFS 17.10.02软件的功能,并学会如何使用该软件修改手机的串码、MEID码等参数。 总的来说,这两个版本的DFS软件都是高通联机修改串码、MEID码等参数的强大工具,通过观看对应版本的视频教程,您将能够掌握这些软件的基本使用方法,从而实现对手机参数的修改。我们希望这些视频教程能够帮助到您,如果您在学习过程中有任何问题,请随时与我们联系。 ### 回答2: 高通联机修改串码MEID码等参数的软件DFS两个版本,下面通过文字回答为您详细介绍。 首先,DFS软件是一款针对高通芯片手机的工具,可以修改手机的一些重要参数,如MEID码,串码等。通过修改这些参数,可以实现一些特殊需求的定制化操作。 DFS软件共有两个版本,分别为DFS 17.08.02和DFS 17.10.02。这两个版本的软件界面和操作方式基本相同,主要是在功能和稳定性上有所差异。 DFS 17.08.02是早期版本,具有稳定性高、兼容性好的特点。它能够对高通芯片手机进行一些基本的参数修改,如修改MEID码、串码等。该版本的DFS软件在修改参数的过程中相对稳定,不容易出现错误,因此用户在操作时相对简单,适合初学者使用。 而DFS 17.10.02是近期推出的更新版本,相比于早期版本,它在功能上有所增加和改进。除了基本的参数修改之外,还能够实现更多的高级功能,如读取手机的详细信息、转储手机固件等。虽然该版本相对于早期版本来说功能更多,但是同时也增加了一些复杂操作的步骤,因此对用户的操作要求稍高一些。 对于初学者来说,建议使用DFS 17.08.02版本的软件进行操作,因为它稳定性高、操作简单。而对于有一定经验的用户来说,可以使用DFS 17.10.02版本,以便获得更多的高级功能。 总结来说,DFS软件是一款高通芯片手机参数修改工具,有两个版本分别是DFS 17.08.02和DFS 17.10.02。这两个版本在功能和稳定性上有所差异,用户可以根据自身需求和经验选择使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值