题目描述
XX 星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。
XX 星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。
如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。
*WWWBBB
其中,W 字母表示白色青蛙,B 表示黑色青蛙,∗ 表示空杯子。
XX 星的青蛙很有些癖好,它们只做 3 个动作之一:
-
跳到相邻的空杯子里。
-
隔着 1 只其它的青蛙(随便什么颜色)跳到空杯子里。
-
隔着 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())