有$n(1 < n < 10)$个段落初始按一定顺序排列,要求通过“剪切”和“粘贴”操作把这n个段落调整为按编号1,2,…,n顺序排列。其中每次可以同时剪几个连续的段落,求最少的操作步数。
链接
题解
如果采用BFS进行状态搜索,总的状态数为$9! = 362880$,这个状态数量不是很大,但是每个状态的后继转移情况很多(可以剪切任意一个区间粘贴在剪切后的序列的任意一个位置处),所以可能会超时。
采用IDA*求解,可以发现$n <= 9$ 时最多只需要8步,因为深度上限为8。接下来考虑剪切时的启发函数,统计序列中后继不正确的数字个数h,可以证明每次剪切时h最多减少3,因此当h / 3 > maxd - d
,即3d + h > 3maxd
时可以剪枝,其中d为当前深度,maxd为深度限制。
代码
1 | /* |