蓝桥杯 扩散【第十一届】【决赛】【B组】 【Python】 多源点BFS+deque双向队列优化

本文通过一道扩散题目探讨了BFS算法的优化方法,对比不同数据类型的处理速度,提出使用deque双向队列与集合组合的方式来提升算法效率。

题目

在这里插入图片描述

分析

给出四个点求经过2020分钟后扩散成几个点了,以点为中心向四周扩散的话容易想到是要使用BFS实现。=》多源点BFS

  • 本题的难点是如何才能更优的存储、使用数据。如果在考场上跑了几分钟还没出结果是很影响心态的!!!! 一定要会提升效率

这篇文章分析几种数据类型使用的很棒

通过比较我们发现,不同的数据类型它的处理速度是不一样的。
在队列模型中,最快的是deque双向队列,其次是列表,最后是queue单向队列,没想到列表不是最慢的。

如果要进行数据存储的话集合是最快的,其次是字典,最后时列表,所以进行数据存储的话不要再使用列表啦!(更正:涉及数据查找时不要在列表里面查找)

根据以上结论,以后的BFS要使用deque+集合(判断是否访问过)(如果需要记录路径就用字典)的形式进行计算。

  • 另外,本题为了实现当2020分钟后,退出搜索,我们不妨为入队的每一个坐标绑定一个新的属性,记录该点是第几分钟被染色的,(0,0,0) (0,0)坐标是0分钟染色的,当第三位>=2020 就退出搜索

代码

import collections

d=[(1,0),(-1,0),(0,1),(0,-1)]
 
pre={(0,0):(0,0),(2020, 11):(2020,11),(11, 14):(11, 14),(2000, 2000):(2000, 2000)}#初始状态,自己是自己的前节点,本题不用保存路径,完全可以用set
ans=4#已经有4个为黑色
queue=collections.deque()
queue.append((0,0,0))#为入队列的坐标新增一个属性,记录当前是第几分钟被染色的!!!!
queue.append((2020, 11, 0))
queue.append((11, 14, 0))
queue.append((2000, 2000, 0))
 
while queue:
    t=queue.popleft()
    if t[2]>=2020:
        print(ans)
        break
    else:
        for i in d:
            nx,ny=t[0]+i[0],t[1]+i[1]
            if (nx,ny) not in pre.keys() :#题目说画布是无限大的,没有边界问题
                queue.append((nx,ny,t[2]+1))
                pre[(nx,ny)]=(t[0],t[1])
                ans+=1#记录被染色的个数
#扩散 20312088
                

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值