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;
}
一开始用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;
}
相关文章推荐
- UVa 11212 Editing a Book (编辑书稿)迭代加深
- uva11212 编辑书稿 迭代加深
- UVA 11212 Editing a Book [迭代加深搜索IDA*]
- UVa_11212(迭代加深搜索)
- uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索
- 迭代加深搜索--IDA*--uva11212 Editing a book
- UVa 11212 编辑书籍 Editing a Book 迭代加深
- 搜索·IDA*·UVA11212 编辑书稿
- 迭代加深搜索IDA*---uva1343 the rotation game
- [UVa 11212] Editing a Book (迭代加深搜索)
- UVA - 11212 Editing a Book(迭代加深搜索 IDA* + 模板)
- uva 11212 - Editing a Book(迭代加深搜索 IDA*) 迭代加深搜索
- UVA UVA - 1374 Power Calculus 快速幂计算(迭代加深搜索)
- UVA 1374 迭代加深搜索
- 埃及分数 迭代加深搜索 IDA*
- 埃及分数 迭代加深搜索 IDA*
- UVA-12558 Egyptian Fractions (HARD version) (IDA* 或 迭代加深搜索)
- 埃及分数 迭代加深搜索 IDA*
- UVa11212 编辑书稿(Editing a book)
- UVa 529 POJ 2248 - Addition Chains ,迭代加深搜索+减枝