深度優先搜索與廣度優先搜索

深度/廣度優先搜索

#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 :

[[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附近四個方向點, 的四個方向 (深度優先搜索)

代碼 :

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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章