这一次总结一下 BFS 的几个主要步骤
肯定会用到 deque 的结构用来模拟队列,BFS精髓也在这里。
- 队列里肯定是有一个初始点
- 然后每次处理从队列中出队一个元素
- 对元素进行扩张(具体如何扩张需要根据题目要求,一般是上下左右四个方向,本题是算上斜向共8个方向)
- 对于扩张后满足某条件的点再进行处理,根据需要进入队列,进入队列的点就是扩到下一层的点(不同题目需要处理的方法不同,大家灵活运用)
- 然后接着循环处理 deque 中的元素,直到 deque 为空,则代表所有点都已经完成扩张
- 最后根据题目要求输出结果(当然这已经不属于 BFS 模板的范围了)
queue=collections.deque([])
queue.append(第一个满足条件的点)
while queue 不空:
cur = queue.popleft()
标记我们访问过cur这个点,从而之后不会再访问到这个点
for 节点 in cur的所有相邻节点:
if 该节点有效且满足条件:
queue.append(该节点)
标记我们访问过这个节点
回溯算法框架
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
全排列
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
res = []
path = []
n = len(nums)
used = [False] * n
def dfs(path ,used):
if len(path) == n:
res.append(path.copy())
return
for i in range(n):
if used[i]: continue
used[i] = True
path.append(nums[i])
dfs(path,used)
path.pop()
used[i] = False
dfs(path,used)
return res