[Leetcode] 每日两题 773 207 -day105 BFS(2)

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       
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值