蓝桥杯:青蛙跳杯子 【BFS】【Python】

本文介绍了一道关于XX星球青蛙宠物的游戏问题,要求通过最少步骤调整青蛙在茶杯中的位置,实现从初始状态到目标状态的转换,利用BFS算法求解并演示了代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

XX 星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。

XX 星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。

如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。

*WWWBBB

其中,W 字母表示白色青蛙,B 表示黑色青蛙,∗ 表示空杯子。

XX 星的青蛙很有些癖好,它们只做 3 个动作之一:

  1. 跳到相邻的空杯子里。

  2. 隔着 1 只其它的青蛙(随便什么颜色)跳到空杯子里。

  3. 隔着 2 只其它的青蛙(随便什么颜色)跳到空杯子里。

对于上图的局面,只要 1 步,就可跳成下图局面:

WWW*BBB

本题的任务就是已知初始局面,询问至少需要几步,才能跳成另一个目标局面。

输入描述

输入为 2 行,2 个串,表示初始局面和目标局面。我们约定,输入的串的长度不超过 15。

输出描述

输出要求为一个整数,表示至少需要多少步的青蛙跳。

输入输出样例

示例

输入

*WWBB
WWBB*

输出

2

 BFS解决,青蛙每步可以往前跳1,2,3下,也可以往后跳1,2,3下,但要注意不能跳出界

代码实现

import collections
def bfs():
    q = collections.deque()
    dist = {}                                   #字典存储次数
    dist[s1] = 0
    dir = [1,2,3,-1,-2,-3]                      #跳跃方向
    q.append(s1)

    while q:
        now = list(q.popleft())                 #将字符串逐个加入列表操作
        if "".join(now) == s2:
            return dist["".join(now)]
        pos = now.index("*")                    #找到空杯子
        for i in dir:
            new_now = now.copy()                
            num_index = pos + i                 #跳跃的距离     
            if num_index >= 0 and num_index < len(s1):      #不能跳过界
                new_now[pos],new_now[num_index] = new_now[num_index],new_now[pos]    #交换杯子和青蛙的位置
                if "".join(new_now) not in dist.keys():
                    dist.setdefault("".join(new_now),dist["".join(now)]+1)           #记录次数
                    q.append("".join(new_now))



s1 = input()
s2 = input()
print(bfs())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值