编辑书稿

uva 11212
关于迭代加深和启发式函数的详细解说:https://blog.csdn.net/flsjzl/article/details/51785488

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
 
const int maxn = 10;
 
int n,a[maxn];
 
bool ans_sort(){
    for(int i = 0;i < n-1;i++){
        if(a[i] >= a[i]+1)return false;//判断是否有序
    }
    return true;
}
 
int h(){
    int cnt =  0;
    for(int i = 0;i < n-1; i++)
        if(a[i]+1 != a[i+1])cnt++;//如果他加1等于他的下一个,则这个有序,否则无序,然后统计
    if(a[n-1] != n)cnt++;//判断最后一个数是否等于n
    return cnt;
}
 
bool dfs(int d,int maxd){
    if(d*3 + h() >= maxd*3)return false;//启发式函数估计
    if(ans_sort())return true;//判断是否顺序正确
    int o[maxn],b[maxn];
    memcpy(o,a,sizeof(a));
    for(int i = 0;i < n; i++){//设置剪切文本的最左边下标
        for(int j = i;j < n; j++){//设置剪切文本的最右边下标
            int cnt = 0;
            for(int k = 0;k < n;j++)
                if(k < i || k > j)b[cnt++] = a[k];//剪切时剩余部分连起来
            for(int k = 0;k <= cnt; k++){
                int cnt2 = 0;
                for(int p = 0;p < k; p++)a[cnt2++] = b[p];//插入文本之前的文本
                for(int p = i;p <= j;p++)a[cnt2++] = o[p];//插入的文本
                for(int p = k;p < cnt;p++)a[cnt2++] = b[p];//插入文本之后的文本
 
                if(dfs(d+1,maxd))return true;//深搜
                memcpy(a,o,sizeof(a));//还原a数组方便下次递归
            }
 
        }
    }
    return false;
}
 
int solve(){
    int max_ans = 5;//运用数学思维估计。。。
    for(int maxd = 1;maxd < 5;maxd++){
        if(dfs(0,maxd))return maxd;//迭代加深搜
    }
    return max_ans;
}
 
int main(){
    while(scanf("%d",&n) == 1 && n){
        int kase = 1;
        for(int i = 0;i < n; i++)scanf("%d",&a[i]);
        printf("Case %d: %d\n",kase++,solve());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值