IDA*
https://www.acwing.com/problem/content/description/182/
acwing 182.排书

假设一次移动$i$本书,那么可以移动的方案有$(n - i + 1)$种,可以插入的位置有$(n - i)$种,即方案数有$(n - i + 1)* (n - i)$种。$i$从1开始枚举到$n$。
所以方案数是$n * (n - 1) + (n - 1)* (n - 2)\cdot \cdot \cdot + 2 * 1$。但是方案移动的过程是对称的,即往后和往前是有相同操作的。所以还需要除以2。
但是求出来方案数量非常大,而题目所说的答案层数必然在很小的位置,所以使用IDA*搜索。
估价函数设为每个数后继节点是否是正确的个数。即是不是满足$p[i] ==p[i - 1] + 1$的个数。每次移动,最多可以修正三个后继。所以求出不满足后继的个数$tot$。
估价函数的是$(tot + 2) / 3$。ps:$tot$是要除以3然后上取整。
在枚举过程中,先是枚举要移动的序列长度$len$,再枚举这个序列的左端点$l$,然后枚举后面一个要交换的序列的右端点$k$。因为要移动数组的数字并且需要回溯,所以需要一个临时数组缓存当前数组的数字。
https://www.acwing.com/problem/content/183/
acwing 181.回转游戏

首先,一共8个操作,每一个决策都有8个分支,所以决策树的分支以及深度是非常大的, 但是答案是在较浅的位置,就考虑使用迭代加深搜索+估值函数,也就是$IDA*$。
可以按照输入的顺序给数据编码。
0 1
2 3
4 5 6 7 8 9 10
11 12
13 14 15 16 17 18 19
20 21
22 23
这样,可以存储$A-G$ 8个操作的标号,打表。这题有个明显的剪枝,就是如果再进行一个操作后进行逆操作是无效的,而且需要回溯,所以逆操作也要打一个表,用来判断和回溯。
其次还需要存储中间八个点的坐标。
接下来就是简单的$dfs$爆搜,按照操作的字典序爆搜。

浙公网安备 33010602011771号