您的位置:首页 > 其它

IDA*,迭代加深搜索(编辑书稿,uva 11212)

2016-08-07 01:38 351 查看
复习一下,好处多多。

一开始用vector,真是慢死了,直接超时。

后来改成int就过了。

迭代加深搜索从0开始搜。

如何对int进行剪切想了一段时间。

代码

#include<stdio.h>
using namespace std;

int n;
int maxd;
int kase;
int ans[10];

int CNT(int a)
{
int cnt=0;
for(int i=0;i<n-1;i++)
{
int ge=a%10;
a/=10;
int shi=a%10;
if(shi+1!=ge) cnt++;
}
return cnt;
}

int get(int a,int l,int r,int k)
{
int ans[10];
for(int i=n-1;i>=0;i--)
{
ans[i]=a%10;
a/=10;
}
int ANS[10];
int K=k;
for(int i=l;i<=r;i++,K++)
ANS[K]=ans[i];
K=0;
for(int i=0;i<n;i++)
{
if(i>=l&&i<=r) continue;
while(K>=k&&K<=k+r-l) K++;
ANS[K]=ans[i];
K++;
}
int ret=0;
for(int i=0;i<n;i++)
{
ret*=10;
ret+=ANS[i];
}
return ret;
}

bool dfs(int d,int a)
{
if(d==maxd)
{
if(a==ans
) return true;
else return false;
}
int cnt=CNT(a);
if((maxd-d)*3<cnt) return false;
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
for(int k=0;k<n-(j-i);k++)
if(dfs(d+1,get(a,i,j,k))) return true;
return false;
}

int main()
{
ans[1]=1;
for(int i=2;i<=9;i++)
ans[i]=ans[i-1]*10+i;
while(scanf("%d",&n),n)
{
int a=0;
int temp;
for(int i=0;i<n;i++)
{
scanf("%d",&temp);
a*=10;
a+=temp;
}
for(maxd=0;;maxd++)
if(dfs(0,a))
break;
printf("Case %d: %d\n",++kase,maxd);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: