LeetCode-【BFS】解題技巧

LeetCode題目:地圖分析

題目分析(分析轉自sweetiee):

這是一道典型的BFS基礎應用,爲什麼這麼說呢?
因爲我們只要先把所有的陸地都入隊,然後從各個陸地同時開始一層一層的向海洋擴散,那麼最後擴散到的海洋就是最遠的海洋!
並且這個海洋肯定是被離他最近的陸地給擴散到的!
下面是擴散的圖示,1表示陸地,0表示海洋。每次擴散的時候會標記相鄰的4個位置的海洋:


你可以想象成你從每個陸地上派了很多支船去踏上偉大航道,踏遍所有的海洋。每當船到了新的海洋,就會分裂成4條新的船,向新的未知海洋前進(訪問過的海洋就不去了)。如果船到達了某個未訪問過的海洋,那他們是第一個到這片海洋的。很明顯,這麼多船最後訪問到的海洋,肯定是離陸地最遠的海洋。

    def maxDistance(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        # 使用數組模擬隊列
        data = []
        raw = len(grid)
        col = len(grid[0])
        for r in range(raw):
            for c in range(col):
                if grid[r][c] == 1:
                    data.append([r,c])
        d = [(0,-1),(0,1),(1,0),(-1,0)]
        res = -1
        # 保持隊列有序pop
        while data:
            x,y = data.pop(0)
            # 將其四周的海洋入隊
            for i,j in d:
                c_x,c_y = x+i,y+j
                # 1)判斷邊界;2)判斷該點是否已遍歷
                if c_x >= 0 and c_x < raw and c_y >= 0 and c_y < col and grid[c_x][c_y] == 0:
                    # 標記海洋爲已訪問
                    grid[c_x][c_y] = grid[x][y]+1
                    ¥ 將海洋加入到隊列
                    data.append([c_x,c_y])
                    res=grid[x][y]
        return res

 

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