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为例)