码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-04-01 10:58:07      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:dfs   ==   poj   ret   遍历   return   ace   结果   目标   

题目链接: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*搜索的一个应用

标签:dfs   ==   poj   ret   遍历   return   ace   结果   目标   

原文地址:https://www.cnblogs.com/randy-lo/p/12610565.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!