poj 3460【IDA*算法】【迭代加深】

题目传送门

迭代加深+估计函数
估计函数:每次操作都能把3个错误点改正,消除所有错误点操作次数为tot/3 上取整 = (tot+2)/ 3;

#include<iostream>
using namespace std;
const int N=16;
int n,q[N];
int w[6][N];

int f()
{
    int res=0;
    for(int i=0;i<n-1;i++)
        if(q[i]!=q[i+1]-1) res++;
    res+=2;
    return res/3;
}
bool judge()
{
    for(int i=0;i<n-1;i++)
        if(q[i]!=q[i+1]-1)
            return false;
    return true;
}

bool dfs(int depth,int max_depth)
{
    if(depth+f()>max_depth) return false;
    if(judge()) return true;
    // 枚举转态;
    for(int len=1;len<=n;len++)
    {
        for(int l=0;l+len-1<n;l++)
        {
            int r=l+len-1;
            for(int k=r+1;k<n;k++)
            {
                int x,y;
                memcpy(w[depth],q,sizeof q);
                for(x=r+1,y=l;x<=k;x++,y++)
                {
                    q[y]=w[depth][x];
                }
                for(x=l;x<=r;x++) q[y++] = w[depth][x];
                if(dfs(depth+1,max_depth)) return true;
                memcpy(q,w[depth],sizeof w[depth]);
            }
        }
    }
    return false;
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=0;i<n;i++) cin>>q[i];
        int depth=0;
        while(depth<5 && !dfs(0,depth)) depth++;
        if(depth>=5) puts("5 or more");
        else cout<<depth<<endl;
    }

    return 0;
}

发布了152 篇原创文章 · 获赞 4 · 访问量 3871

猜你喜欢

转载自blog.csdn.net/qq_43716912/article/details/100943525