蓝桥杯—青蛙跳杯子(python、广度优先搜索)
本文灵感来自八数码问题。参考八数码文章 https://www.cnblogs.com/heyjjjjj/p/13401364.html,一篇很优秀的文章。
问题描述
X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。
X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。
如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙。
*WWWBBB
其中,W字母表示白色青蛙,B表示黑色青蛙,*表示空杯子。
X星的青蛙很有些癖好,它们只做3个动作之一:
1. 跳到相邻的空杯子里。
2. 隔着1只其它的青蛙(随便什么颜色)跳到空杯子里。
3. 隔着2只其它的青蛙(随便什么颜色)跳到空杯子里。
对于上图的局面,只要1步,就可跳成下图局面:
WWW*BBB
本题的任务就是已知初始局面,询问至少需要几步,才能跳成另一个目标局面。
输入为2行,2个串,表示初始局面和目标局面。
输出要求为一个整数,表示至少需要多少步的青蛙跳
样例输入
∗ * ∗WWBB
WWBB ∗ * ∗
样例输出
2
样例输入
∗ * ∗WWBB
WWBB ∗ * ∗
样例输出
10
数据规模和约定
我们约定,输入的串的长度不超过15
思路
把青蛙跳杯子的问题转换为杯子可以向左移动1、2、3个位置,向右移动1,2,3个位置,注意 * 在边缘时不可超出范围移动,这样,每种情况最多有六种可能,将问题转换为了广度优先搜索。将每种情况保存在open列表中,避免重复。建立一个评估函数,不在位数,不在位数是指若对于一个格子,他的对应位置的数不是目标数,则加一。我们优先趋向于处理评估函数值更小的那种方向。
本文在处理字符串时,将W转换为1,B转换为2, ∗ * ∗转换为0。
注:本文在处理13个以上字符串时超出了规定时间,如果各位解决了该问题欢迎在评论区留言,这个问题网上没有找到用python编程的,博主实力不够。
#青蛙跳杯子
import copy
#保存结果
result = []
class status():
# 以树的形式记录搜索
# status是树的一个节点
father=None
def __init__(self,lst,evaluate,step):
self.lst=lst #记录当前状态
self.evaluate=evaluate #估价函数值
self.step=step #递归树的深度
def point_father(self,f):
self.father=f #指向父节点
def change_evaluate(self,e):
self.evaluate=e #更新估价函数值
def compute_count_unpos(lst,b):
#不在位数
count=0
for i in range(len(lst)):
if(lst[i]==0):
continue
if(lst[i]!=b.lst[i]):
count+=1
return count
def develop(now):
#通过移动杯子位置,拓展现在的状态,生成移动后可能的状态并以列表形式返回
out = []
temp = copy.deepcopy(now.lst)
for i in range(len(temp)):
if(temp[i] == 0):
pos = i
#当长度为3
if(len(temp) == 3):
if(pos == 0):
#向右一个
temp[pos],temp[pos+1] = temp[pos+1],temp[pos]
out.append(temp)
temp = copy.deepcopy(now.lst)
#向右两个
temp[pos],temp[pos+2] = temp[pos+2],temp[pos]
out.append(temp)
if(pos == 1):
#向左一个
temp[pos],temp[pos-1] = temp[pos-1],temp[pos]
out.append(temp)
temp = copy.deepcopy(now.lst)
#向右一个
temp[pos],temp[pos+1] = temp[pos+1],temp[pos]
out.append(temp)
if(pos == 2):
#向左一个
temp[pos],temp[pos-1] = temp[pos-1],temp[pos]
out.append(temp)
temp = copy.deepcopy(now.lst)
#向左两个
temp[pos],temp[pos-2] = temp[pos-2],temp[pos]
out.append(temp)
#当长度为4
if(len(temp) == 4):
if(pos == 0):
temp[pos],temp[pos+1] = temp[pos+1],temp[pos]
out.append(temp)
temp = copy.deepcopy(now.lst)
#向右两个
temp[pos],temp[pos+2] = temp[pos+2],temp[pos]
out.append(temp)
temp = copy.deepcopy(now.lst)
#向右三个
temp[pos],temp[pos+3] = temp[pos+3],temp[pos]
out.append(temp)
if(pos == 1):
#向左一个
temp[pos],temp[pos-1] = temp[pos-1],temp[pos

最低0.47元/天 解锁文章
413

被折叠的 条评论
为什么被折叠?



