前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度优先搜索与广度优先搜索

深度优先搜索与广度优先搜索

作者头像
Autooooooo
发布2020-11-09 10:29:27
1.1K0
发布2020-11-09 10:29:27
举报
文章被收录于专栏:CoxhuangCoxhuang

深度/广度优先搜索

#1 深度优先搜索(DFS)

Depth-First-Search

步骤 : 不到尽头不回头

  1. 从 1 开始,先找到其中一个相连的,2 被找到了
  2. 然后直接开始从 2 开始搜索,3 被找到了
  3. 然后从 3 开始搜索,4 被找到了
  4. 然后从 4 开始搜索,5 被找到了
  5. 然后从 5 开始搜索,忽略已经找到的所以啥都没找到
  6. 然后没路可走了,回到前面去再走另一条路
  7. 从 4 开始,6 被找到了,然后又没路可走了
  8. 然后再回去前面 4,然后没路了
  9. 回去前面 3,然后一直这样

1-2-3-4-5-6

#2 广度优先搜索(BFS)

Breadth-First-Search

步骤 :

  1. 从 1 开始进行搜索的话
  2. 先搜索所有和 1 相连的,也就是 2 和 5 被找到了
  3. 然后再从 2 开始搜索和他相连的,也就是 3 被找到了
  4. 然后从 5 搜,也就是 4 被找到了
  5. 然后从 3 开始搜索,4 被找到了,但是 4 之前已经被 5 找到了,所以忽略掉就行
  6. 然后 3 开始搜索,忽略 4 所以啥都没搜到,然后从 4 开始,6 被找到了

1-2-5-3-4-6

#3 算法题

#3.1 岛屿的最大面积

LeetCode :

https://leetcode-cn.com/problems/max-area-of-island/

题目 :

给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地)构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。

找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)

示例1 :

代码语言:javascript
复制
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
 [0,0,0,0,0,0,0,1,1,1,0,0,0],
 [0,1,1,0,1,0,0,0,0,0,0,0,0],
 [0,1,0,0,1,1,0,0,1,0,1,0,0],
 [0,1,0,0,1,1,0,0,1,1,1,0,0],
 [0,0,0,0,0,0,0,0,0,0,1,0,0],
 [0,0,0,0,0,0,0,1,1,1,0,0,0],
 [0,0,0,0,0,0,0,1,1,0,0,0,0]]

对于上面这个给定矩阵应返回 6。

题目解读 :

  • 每个元素,只能关联东南西北四个方向
  • 在所给的二维矩阵中,找到由"1"相连的数量最多

思路 :

  1. 首先遍历每一个元素为 “1” 的点, 记为a
  2. 然后根据点a, 东南西北四个方向, 找到为 “1” 的点
  3. 递归a附近四个方向点, 的四个方向 (深度优先搜索)

代码 :

代码语言:javascript
复制
class Solution:
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        
        ret = 0 # 最大面积 
        for row, x in enumerate(grid):
            for col, y in enumerate(x):
                if grid[row][col] != 0: # 只有当元素为 "1" 时, 才使用深度优先搜索 
                    ret = max(ret, self.dfs(grid,row,col)) # 每次DFS后, 与之前的最大面积相比, 取最大值 

        return ret

    def dfs(self, grid, x, y): # 深度优先遍历 

        if x<0 or y<0 or x>=len(grid) or y>=len(grid[0]): # 越界 -> 返回 0 
            return 0
        if grid[x][y] == 0: # 不是陆地 -> 返回 0 
            return 0

        grid[x][y] = 0 # 被查询过得点, 标记 0 

        return self.dfs(grid,x,y+1) + self.dfs(grid,x,y-1) + self.dfs(grid,x+1,y) + self.dfs(grid,x-1,y) + 1 # (x,y)的四个方向 (x,y+1) (x,y-1) (x+1,y) (x-1,y), 每个方向调用DFS 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 深度/广度优先搜索
  • #1 深度优先搜索(DFS)
  • #2 广度优先搜索(BFS)
  • #3 算法题
    • #3.1 岛屿的最大面积
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档