POJ3134 Power Calculus IDA*搜索的一个应用

Posted WA自动机~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ3134 Power Calculus IDA*搜索的一个应用相关的知识,希望对你有一定的参考价值。

题目链接:http://poj.org/problem?id=3134

题目给出一个初始的x,要求操作只能是乘与除,问最少需要多少步才能算出x^n。这道题等价于给一个1,只能加或者减,问最少需要多少步才能得到n。可以把n拆开成许多个数相加或者相减,从搜索的角度来讲,用普通dfs的话很可能深度达到1000,所以可以对depth进行遍历,并且设置估价函数进行剪枝,只要当前的值以最快的方式迭代也不能得到n则说明在当前设置的深度下是不能达到预期的结果的。

代码如下:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define abs(x) (x)>0?(x):(-(x))
 4 using namespace std;
 5 int n;
 6 int a[1005];
 7 int tmp=0;
 8 bool dfs(int cur,int dep)//当前搜索深度,目标深度 
 9 {
10     if((a[cur-1]<<(dep-cur))<n)return false;//以最快的方式迭代也不能得到最终的结果 
11     if(cur>dep)return false;
12     if(cur==dep&&a[cur-1]==n)return true;
13     for(int i=0;i<cur;i++)//对前面已经获得的加数进行枚举 
14     {
15         a[cur]=a[cur-1]+a[i];//a[cur-1]是前面已经得到的最终加数 
16         if(dfs(cur+1,dep))return true;
17         a[cur]=abs(a[cur-1]-a[i]);
18         if(dfs(cur+1,dep))return true;
19     }
20     return false;
21 }
22 int main()
23 {
24     while(scanf("%d",&n)&&n)
25     {
26         int dep=0;//目标深度代表操作次数 
27         tmp=0;
28         while(1)
29         {
30             a[0]=1;
31             if(dfs(1,dep))break;
32             dep++; 
33         }
34         printf("%d\n",dep-1);//由于在第0层没有操作,所以减一 
35     }
36  } 

 

以上是关于POJ3134 Power Calculus IDA*搜索的一个应用的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3134 - Power Calculus (IDDFS)

POJ-3134-Power Calculus(迭代加深DFS)

POJ3134 Power Calculus IDA*搜索的一个应用

迭代加深搜索(以Power Calculus POJ--3134 UVa--1374为例)

POJ 3134 Power Calculus (迭代剪枝搜索)

UVa1374 Power Calculus (IDA*)