其他分享
首页 > 其他分享> > POJ3134 Power Calculus IDA*搜索的一个应用

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  } 

 

标签:Calculus,return,cur,Power,int,POJ3134,dfs,dep,深度
来源: https://www.cnblogs.com/randy-lo/p/12610565.html