BFS专题(2)
今天面试正好碰见了一个BFS的题 然后在leetcode 找到了类似的题如下
773. 滑动谜题
为了寻找最少交换次数 ,所以需要暴力搜索来找到答案, 使用BFS
对于当前的lis 找到当前 0 的位置, 将其加入队列
每当从队列中弹出元素,判断其是否和目标相同,若相同则返回 次数
否则判断其可以交换的位置,得到新的lis 以及新的 0 的位置,判断该新lis是否在之前出现过,若没出现过,将其加入队列中,并且移动次数+1
若队列为空都没找到答案 那么返回-1
class Solution:
def slidingPuzzle(self, board: List[List[int]]) -> int:
goal = [1,2,3,4,5,0]
lis = []
for i in range(2):
for j in range(3):
lis.append(board[i][j])
if board[i][j] ==0:
x,y =i,j
que =[[lis,x,y,0]]
loglist= [lis]
while que:
tmp, nex,ney,tim = que.pop(0)
if tmp == goal:
return tim
for dx,dy in [[nex+1,ney],[nex-1,ney],[nex,ney+1],[nex,ney-1]]:
if 0<=dx <2 and 0<=dy<3:
nlis = tmp.copy()
nlis[nex*3+ney] = nlis[dx*3+dy]
nlis[dx*3+dy] = 0
if nlis not in loglist:
loglist.append(nlis)
que.append([nlis,dx,dy,tim+1])
return -1
207. 课程表
BFS
遍历 先决条件 表, 维护一个 需求表,表示这门课 是哪些课的需求课, 维护一个条件表 表示一门课需要几个先决课, 将条件表为0 的课加入 队列,每弹出一门课, 根据需求表,将其对于的被需求课 的条件值- 1,若条件值为0 将其加入队列中。最后判断是否弹出所有课。
class Solution:
def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool:
dic = defaultdict(int)
lis = [[]for _ in range(numCourses)]
for x,y in prerequisites:
lis[y].append(x) # 有课程y 是课程x的先决课程
dic[x] +=1
que = []
for i in range(numCourses):
if dic[i] ==0:
que.append(i)
res = 0
while que:
x = que.pop()
res +=1
for i in lis[x]:
dic[i] -=1
if dic[i]==0:
que.append(i)
if res ==numCourses:
return True
return False