走迷宫最笨的一种方法是右手摸墙, 实际上是一种深度优先搜索(DFS). 对于迷宫树来说, DFS会一路走到叶子节点返回. 广度优先搜索不一样, 对于当前节点可以访问到的全部子节点都会入队, 叶子节点返回.
广度优先搜索
队列
队列先进先出的数据结构, Python实现比较简单.
queue = []
# 入队
e = 1
queue.append(e)
# 出队
queue.pop(0)
搜索
queue = [frist]
while len(queue) != 0:
_ = queue.pop(0)
岛屿数量
- 题目描述
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
输入:
11110
11010
11000
00000
输出: 1
- 解法
定义岛屿
maps = [
[1, 1, 1, 0],
[1, 0, 1, 0],
[1, 0, 0, 0],
[1, 0, 0, 0],
]
初始化 visited visited = [[False for _ in range(len(maps[0]))] for _ in range(len(maps))]
. 遍历 maps
, bfs.
def s():
ans = 0
for y in range(len(maps)):
for x in range(len(maps[0])):
if maps[y][x] == 1 and visited[y][x] == False:
bfs(y, x)
visited[y][x] = True
ans += 1
elif visited[y][x] == False:
visited[y][x] = True
print(ans)
bfs
def bfs(y, x):
queue = [(y, x)]
while len(queue) != 0:
pos = queue.pop(0) # 出队
if 0 <= pos[0]+1 < len(maps) and 0 <= pos[1] < len(maps[0]) and not visited[pos[0]+1][pos[1]] and maps[pos[0]+1][pos[1]] == 1:
queue.append((pos[0]+1, pos[1])) # 入队
if 0 <= pos[0]-1 < len(maps) and 0 <= pos[1] < len(maps[0]) and not visited[pos[0]-1][pos[1]] and maps[pos[0]-1][pos[1]] == 1:
queue.append((pos[0]-1, pos[1]))
if 0 <= pos[0] < len(maps) and 0 <= pos[1]+1 < len(maps[0]) and not visited[pos[0]][pos[1]+1] and maps[pos[0]][pos[1]+1] == 1:
queue.append((pos[0], pos[1]+1))
if 0 <= pos[0] < len(maps) and 0 <= pos[1]-1 < len(maps[0]) and not visited[pos[0]][pos[1]-1] and maps[pos[0]][pos[1]-1] == 1:
queue.append((pos[0], pos[1]-1))
visited[pos[0]][pos[1]] = True
标签:bfs,广优,len,queue,maps,range,visited,算盘
From: https://www.cnblogs.com/blogure/p/algo-bfs.html