题目描述

python岛屿面积 python岛屿问题_队列

很显然,这题是一个很经典的深广度优先问题,在这里我们主要讲广度优先,因为在Python中,在利用栈–深度优先,队列–广度优先的时候,其实原理是差不多的,只是**pop()**的位置不一样。

解题思路

什么叫广度优先搜索,就是以一个节点为初始节点,将此节点所能遍历的位置都遍历一遍,可以类比树的层次遍历

具体怎么做呢,直接甩代码,因为这是这类问题解决的模板,只要认真思考,掌握了,下次就可以直接写了。

def maxAreaOfIsland(grid):
   #获取该岛屿的行列数
    m, n = len(grid), len(grid[0])
    max_area = 0
    queue = []

    #BFS
    for i in range(m):
        for j in range(n):
            # BFS
            if grid[i][j] == 1:
                area_count = 0
                queue.append((i, j))
                #同样也要标记
                grid[i][j] = 0
                
		#队列不为空就一直pop()
                while queue:
                    x, y = queue.pop(0)
                    area_count += 1
                    # 广度优先搜索,向四个方向搜索,看是否存在 ==1 的点
                    for si, sj in ((x - 1, y), (x + 1, y), (x, y + 1), (x, y - 1)):
                        if 0 <= si < m and 0 <= sj < n and grid[si][sj] == 1:
                            queue.append((si, sj))
                            #标记走过的岛屿
                            grid[si][sj] = 0
                max_area = max(max_area, area_count)
    return max_area


print(maxAreaOfIsland([[1,1,0,0,0],[1,1,0,0,0],[0,0,0,1,1],[0,0,0,1,1]]))

最后结果输出的‘4’ ,对着代码一步步走,
首先先对该列表进行循环,当遇见grid[i][j] == 1 的时候,说明发现了新岛屿,对此岛屿进行广度优先搜索,每pop一个节点,就让area_count += 1,很重要的一点,当你搜索到一个为1的岛屿时,必须将其标记为已经走过的,也就是 grid[si][sj] = 0 (你也可以标记其他的,-1什么的都可以,),不然遍历的时候,就会重复计算。
后面也没什么了,每发现一个新岛屿就拿他的面积与 max_area做比较。取最大值,返回max_area。

总结

栈-深度优先搜索其实就是pop最后一个 ,代码形式差不多,有兴趣的小伙伴可以自己去写一写。在迷宫问题,岛屿问题,还有其他的问题中,深广度优先搜索都是很重要的知识,如果是刚接触的小伙伴可能会感觉有点难,多写多画就行了,慢慢的就很容易掌握了。