定义

图解
深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。

网格类问题的 DFS 遍历方法

网格问题的基本概念

我们首先明确一下岛屿问题中的网格结构是如何定义的,以方便我们后面的讨论。
网格问题是由 m * n 个小方格组成一个网格,每个小方格与其上下左右四个方格认为是相邻的,要在这样的网格上进行某种搜索。
岛屿问题是一类典型的网格问题。每个格子中的数字可能是 0 或者 1。我们把数字为 0 的格子看成海洋格子,数字为 1 的格子看成陆地格子,这样相邻的陆地格子就连接成一个岛屿。
在这样一个设定下,就出现了各种岛屿问题的变种,包括岛屿的数量、面积、周长等。不过这些问题,基本都可以用 DFS 遍历来解决。

994. 腐烂的橘子

解答

"""
1、首先分别将腐烂的橘子和新鲜的橘子保存在两个集合中;
2、模拟广度优先搜索的过程,方法是判断在每个腐烂橘子的四个方向上是否有新鲜橘子,如果有就腐烂它。每腐烂一次时间加 +1,并剔除新鲜集合里腐烂的橘子;
3、当橘子全部腐烂时结束循环。
"""
# 整洁版
class Solution:def orangesRotting(self, grid):row = len(grid)col = len(grid[0])rotten = {(i, j) for i in range(row) for j in range(col) if grid[i][j] == 2}  # 腐烂集合fresh = {(i, j) for i in range(row) for j in range(col) if grid[i][j] == 1}  # 新鲜集合time = 0while fresh:if not rotten: return -1rotten = {(i + di, j + dj) for i, j in rotten for di, dj in [(0, 1), (0, -1), (1, 0), (-1, 0)] if(i + di, j + dj) in fresh}  # 即将腐烂的如果在新鲜的集合中,就将它腐烂fresh -= rotten  # 剔除腐烂的time += 1return time# 描述版
class Solution:def orangesRotting(self, grid):#  腐烂橘子集合、新鲜橘子集合fresh, rotten = set(), set()n, m = len(grid), len(grid[0])for i in range(n):for j in range(m):if grid[i][j] == 2:rotten.add((i, j))elif grid[i][j] == 1:fresh.add((i, j))time = 0directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]# 遍历腐烂橘子集合,向各个方位腐烂新鲜的橘子 while fresh:if not rotten:return -1# 即将腐烂的如果在新鲜的集合中,就将它腐烂temp_rotten = set()for i, j in directions:for di, dj in rotten:if (di + i, dj + j) in fresh:temp_rotten.add((di + i, dj + j))rotten = temp_rotten# 将新鲜的橘子腐烂fresh -= temp_rottentime += 1return time

463. 岛屿的周长

给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。

示例 1:
输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
输出:16
解释:它的周长是上面图片中的 16 个黄色的边

解答

class Solution:def islandPerimeter(self, grid):n, m = len(grid), len(grid[0])directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]ans = 0for i in range(n):for j in range(m):if grid[i][j] != 1:continueans += 4for di, dj in directions:temp_i = di + itemp_j = dj + j# 判断新的坐标有没有越界,并且是否又相连的区域;if all([temp_i >= 0, temp_i <= n - 1, temp_j >= 0, temp_j <= m - 1, grid[temp_i][temp_j] == 1]):ans -= 1return ans

130. 被围绕的区域

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

解答

"""1、获取网格的边界2、遍历边界,把相连的并且为O的位置进行转换为*3、还原,把*转换为O,其他的转换为#
"""class Solution:def solve(self, board):def dfs(i, j):if board[i][j] == "O":board[i][j] = "*"for di, dj in directions:tempi, tempj = di + i, dj + j# 判断边界if tempi >= 0 and tempi <= n - 1 and tempj >= 0 and tempj <= m - 1:dfs(tempi, tempj)n, m = len(board), len(board[0])directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]# 获取边界,由边界向里面寻找res = set()for j in range(m):dfs(0, j)dfs(n - 1, j)for i in range(n):dfs(i, 0)dfs(i, m - 1)for i in range(n):for j in range(m):board[i][j] = "O" if board[i][j] == "*" else "X"

695. 岛屿的最大面积

给你一个大小为 m x n 的二进制矩阵 grid 。
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。

解答

"""
思路和上一题一样,不过本次需要递归统计每次查找的数量。
"""
class Solution:def maxAreaOfIsland(self, grid: List[List[int]]) -> int:def dfs(i, j):# 判断边界if not (i >= 0 and i <= n - 1 and j >= 0 and j <= m - 1 and grid[i][j] == 1):return 0num, grid[i][j] = 1, 0for di, dj in [(1, 0), (-1, 0), (0, 1), (0, -1)]:tempi, tempj = di + i, dj + jnum += dfs(tempi, tempj)return numn, m, ans = len(grid), len(grid[0]), 0for i in range(n):for j in range(m):if grid[i][j] == 1:ans = max(ans, dfs(i, j))return ans

Leecode DFS深度优先搜索相关推荐

  1. 图:DFS(深度优先搜索)图解分析代码实现

    文章目录 一.简介 二.图的建立 2.1建立图类 2.2建立图 三.DFS 3.1图解 3.2代码 一.简介 图的DFS(深度优先搜索)与BFS(广度优先搜索)是图的两种遍历方式. 主要区别在于当到达 ...

  2. DFS——深度优先搜索基础

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 review DFS--深度优先搜索 的基础知识: [1]深度优先搜索的应用 1.1)深度优先搜索算法描述(转自 ...

  3. 【算法】蓝桥杯dfs深度优先搜索之排列组合总结

    [导航] 上一篇文章 → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,再次声明下文的大部分灵感均来自于[CSDN]梅森上校<JAVA版本:DFS算法题解两 ...

  4. dfs深度优先搜索_图的深度优先搜索(DFS)

    dfs深度优先搜索 Depth First Search (DFS) is an algorithm that searches a graph/tree, in a depth-wise manne ...

  5. 【蓝桥杯C/C++】专题五:DFS深度优先搜索

    专题五:DFS深度优先搜索 目录 专题五:DFS深度优先搜索 前言 什么是回溯法 如何理解回溯法 回溯法解决的问题 回溯法模板 1 .回溯函数模板返回值以及参数 2. 回溯函数终止条件 3 .回溯搜索 ...

  6. DFS(深度优先搜索)算法实现

    2 DFS算法 DFS(深度优先搜索)算法,搜索过程是类似于不撞南墙不回头的意思,DFS一般使用堆栈(先入后出)这种数据结构实现,由此一来,以初始起点为中心进行搜索,首先是周围点加入到堆栈中,起始点搜 ...

  7. “暴力美学1”——DFS深度优先搜索

    作为新时代青年,"暴力"二字似乎离我们十分遥远,大多数时候我们只能够在电影或者电视剧上接触这个概念 暴力二字或许是个贬义词,但若是我们在后面加上美学二字,或许就是一个值得推敲的词汇 ...

  8. 张三踩瓷砖:C++用DFS深度优先搜索解POJ1979 Red and Black问题

    POJ1979 Red and Black 题目链接: POJ1979 Red and Black 简单理解一下题目: 张三站在一个长方形的房间里,房间里铺满了方形瓷砖,瓷砖有红色和黑色两种,他站在其 ...

  9. 【算法】蓝桥杯dfs深度优先搜索之图连通总结

    前言 上两篇文章 → <[算法]蓝桥杯dfs深度优先搜索之排列组合总结>      → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结>   为了重申感谢之意,第三次声明下文的 ...

最新文章

  1. BF算法优化-------KMP算法
  2. java oralce merge_mybatis 使用oracle merge into 语句踩坑实录(示例代码)
  3. Python 常用 PEP8 编码规范和建议
  4. 岩板铺地好吗_威廉顿岩板1200x2700x9mm,上墙铺地非常好看大气
  5. flask读取数据库(mysql)并展示表格(讲解获取表头的方法)【附上flask好看点的helloworld】
  6. 开始 Sencha Touch 2 之旅之三
  7. Linxu服务器文件双向同步 rsync+sersync 详细讲解
  8. 炒菜机器人放食材的顺序_如果给你个做饭机器人,你会让它做些什么饭菜?
  9. 15年3月c语言试卷,2015年3月计算机二级C语言试卷及答案..doc
  10. Projecting Your View Attentively: Monocular Road Scene Layout Estimation via Cross-view Transformati
  11. Python实现excel重复值计数/记录小白第一次学习
  12. docker - 安装searx搜索引擎
  13. 使用极光推送发送短信验证码
  14. Python中以字母r/R,或字母u/U 开头的字符串
  15. 基于Android+Python Flask框架实现的智慧记单词APP设计
  16. 计算机内存4G,笔记本电脑4g内存和8g内存的区别
  17. Oracle的dual是什么东西啊
  18. python中finally是什么意思_什么是pythontry-finally语句?它能起到什么样的作用?
  19. IEEE Access录用了一篇文章,目前在web of science中还检索不到,请问童鞋们该肿么办?
  20. python气象绘图速成_Python气象绘图Day-By-Day

热门文章

  1. 【linux技术】记一次虚拟机vmware里 Centos7开机故障:sd 0:0:0:0: [sda] Assuming drive cache: write through
  2. Drcom校园网认证系列(一) 抓包
  3. Python语言特色集锦
  4. MATLAB统计分析—描述性统计
  5. PCB:Beyond Part Models: Person Retrieval with Refined Part Pooling(论文阅读笔记)
  6. 看MySQL数据库的观后感,【看点·光】谈谈赏析和读后感(随笔)_mysql执行语句...
  7. STP的安全特性详解与环路保护机制
  8. 做个很小众的应用就可以月入数万,为什么多数程序员都不做个人开发?
  9. Qt无边框窗体实现方案
  10. 国产手机会使用鸿蒙,小米等国产手机会使用鸿蒙系统吗?