迭代加深搜索(IDDFS)

Posted aininot260

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代加深搜索(IDDFS)相关的知识,希望对你有一定的参考价值。

使用普通的DFS可能会让你把时间浪费在深度非常大而且答案不是最优的搜索过程上

些问题搜索时可能会存在搜索很深却得不到最优解的情况

那么我们就给搜索设置一个约束,当搜索深度达到约束值却还没找到可行解时结束搜索

如果我们在一个深度约束下没有搜索到答案,那么答案一定在更深的位置,那么就把约束深度调整到更深,然后再次搜索,直到搜索到答案为止

对当前的情况通过一个乐观估计函数进行预估,如果发现即使在最好的情况下搜索到当前的最深深度限制也没办法得到答案,那么就及时退出来实现剪枝

也就是传说中的IDA*

POJ3134

给定一个正整数n,求经过多少次乘法或除法运算可以从x得到xn,可以使用中间得到的结果

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <string>
 6 #include <sstream>
 7 #include <algorithm>
 8 #include <cmath>
 9 #include <vector>
10 #include <stack>
11 #include <queue>
12 #include <list>
13 #define the_best_pony "Rainbow Dash"
14 
15 using namespace std;
16 
17 int n,maxh;
18 int a[1010];
19 
20 bool dfs(int x,int cur){
21     if(x<<(maxh-cur)<n) return false; //乐观估计剪枝,当前深度到限制深度指数最多增长2^(maxh-cur)倍 
22     if(cur>maxh) return false; //达到限制深度 
23     a[cur]=x;
24     if(x==n) return true;
25     for(int i=0;i<=cur;i++){
26         if(dfs(x+a[i],cur+1)) return true;
27         if(dfs(x>a[i]?x-a[i]:a[i]-x,cur+1)) return true;
28     }
29     return false;
30 }
31 
32 int main(){
33     while(scanf("%d",&n)&&n){
34         maxh=0;
35         memset(a,0,sizeof(a));
36         while(!dfs(1,0)){ //只要没找到答案就一直继续 
37             memset(a,0,sizeof(a)); 
38             maxh++; //增大深度限制 
39         }
40         printf("%d
",maxh); //最大深度就是答案 
41     }
42     return 0;
43 }

 

以上是关于迭代加深搜索(IDDFS)的主要内容,如果未能解决你的问题,请参考以下文章

Loj10022 埃及分数(迭代加深搜索IDDFS)

POJ 3134 IDDFS

C++解题报告 : 迭代加深搜索之 ZOJ 1937 Addition Chains

POJ 3134 - Power Calculus (IDDFS)

[IDDFS+背包] 洛谷P2744 [USACO5.3]量取牛奶Milk Measuring

埃及分数