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$爆搜,按照操作的字典序爆搜。

 

posted @ 2020-03-20 14:55  dzcixy  阅读(108)  评论(0)    收藏  举报