任务描述
本关任务:八数码问题是在一个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,