11212 - Editing a Book(IDA*算法)

又一道迭代加深搜索,从小到大枚举上限 。   关键的剪枝部分是写出启发函数,这个比较难。。

不过每次剪切后,不正确的数字个数最多减三还是很好理解的,因为我们算不正确数字个数的方法是看当前数字+1是不是等于下一个数字 。 所以每次剪切最多只有3个数字的后继数字发生了改变。  那么 剪枝条件就显而易见了 。

代码如下:

#include
using namespace std;
const int maxn = 15;
int n,a[15],kase = 0,maxd;
bool is_sort() {
    for(int i=0;i= a[i+1]) return false;
    return true;
}
int h() {
    int cnt = 0;
    for(int i=0;i maxd*3) return false;//剪枝
    if(d == maxd) {
        if(is_sort()) return true;
        return false;
    }
    int b[maxn],olda[maxn];
    memcpy(olda,a,sizeof(a));//复制以方便恢复

    for(int i=0;i j) b[cnt++] = a[k]; //将未剪切的部分拼接
            for(int k=0;k


你可能感兴趣的:(uva解题报告,暴力,搜索,acm,uva,IDA)