1.题目描述:点击打开链接
2.解题思路:本题利用迭代加深搜索解决。好久没做这个专题了,感觉这种方法有点力不从心,不会寻找估价函数是硬伤。。。只好学一学别人的代码。
本题要求棋盘中间的8个方格都要是相同的数字。紫书上说是利用状态空间搜索解决,大致模板还是八数码问题的模板。但是写了半天最后WA了,感觉这道题用那个模板写出来会很复杂。最后看别人的代码,才发现大多都是利用迭代加深搜索解决的,代码量也不是很大。因此学习这种方法了。
本题的移动比较复杂,因此应当事先保存A,B,C,D四个方向的位置,后四个方向可以反推出来。同时还要保存要观察的8个格子的位置。接下来,先判断是否就是目标状态,如果不是,进行迭代加深搜索。
首先要明白迭代加深搜索具体是如何操作的:从小到大依次枚举深度上限maxd。对于每一个深度上限,进行dfs,当递归到maxd时,就要判断是否找到了解,如果找到了,就记录或者输出解。不论是否找到了解,都要开始返回,对于找到了解的情况,可以在函数出口处连续返回。
那么如何及时的返回呢?答案就是寻找“估价函数”并“剪枝”。对于本题,可以发现,每次移动最多只能让目标数字多1个,因此可以将min{diff(1),diff(2),diff(3)}作为估价函数。其中diff(i)是目标格子中不等于数字i的个数。这样以来,如果发现最少要移动的步数h()仍然大于maxd-cur,就需要进行剪枝。
需要注意的是,迭代加深