八数码问题 (头歌 educoder 启发式搜索)(python实现)

任务描述
本关任务:八数码问题是在一个3×3的棋盘上有1−8位数字随机分布,以及一个空格,与空格相连的棋子可以滑动到空格中,问题的解是通过空格滑动,使得棋盘转化为目标状态,如下图所示。为了简化问题的输入,首先将空格用数字0表示,然后将3×3的棋盘用9位长的字符串表示,则上图的初始状态为724506831,目标状态为012345678,本关卡所有目标状态均为012345678,也保证初始状态到目标状态有解。

测试输入:
724506831 

这道题可以用很多搜索方法解决,启发式搜索为题目要求方法,但是因为评测的程序是只要有一条路径能够成功从输入走到"12345678"即可,于是也可以使用其他搜索方法也可以,比如深搜,广搜都可以,甚至不需要计算代价函数,无脑搜索就可以,但是后来发现不用代价值判断会超时,所以还是加入了代价函数的编写,由于不能贴完整代码,给大家一个模板,大家去写子函数把

深度优先搜索搜模板

子函数:
self.path1(index, i)  index位置是否能够移动
self.moveMap1(init, index, index + self.direction[i]) #index位置与index +direction[i] 交换后的序列
self.isseen(change) change序列是否被走过
self.calcDistH(change) 计算change到targ的代价值




class Solution:
    def __init__(self):
        self.set1 = set()
        self.seen = collections.defaultdict(int) #标记数组
        self.way= {
   0:'r',1:'l',2:'d',3:'u'}  #存储走的方向
        self.path =[]  #存储路径
        self.direction = (1, -1, 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值