POJ 3134 Power Calculus(IDDFS迭代加深搜索)

版权声明:本文为博主原创文章,欢迎转载。如有问题,欢迎指正。 https://blog.csdn.net/weixin_42172261/article/details/88614751

迭代加深搜索(IDDFS)
迭代加深搜索其实就是一种dfs,它只不过是限制了每次搜索的深度,如果在以h为深度的搜索中没有找到答案,那么下一次就会以h+1的深度进行重新的搜索。
bfs基于队列来实现,每次以队首为参照,可以扩展出好多节点,才会释放队首的一个点,这样就会浪费大量的空间。而dfs却在找到最深处返回,释放掉一些没有用的点,这样它所用的空间比bfs小的多。但是如果让求一个最优解或者说是扩展深度最小的答案时,dfs就不行了,用迭代加深搜索,每次限制深搜的深度,这样就能保证答案所在的深度最小了。但是iddfs在deep+1的搜索中会重复之前的部分,这些不需要担心,因为之前的搜索相对于深度加深后的搜索浪费的时间微不足道了。
从实际应用来看,迭代加深搜索的效果比较好,并不比广度优先搜索慢很多,但是空间复杂度却与深度优先搜索相同,比广度优先搜索小很多。
要注意使用iddfs必须保证有解,否则就会一层层加深下去。
迭代加深搜索有一个比较特殊的剪枝方法,就是对当前的情况通过一个乐观估计函数进行预估(不知道是什么高大上的东西),如果发现即使在最好的情况下搜索到当前的最深深度限制也没办法得到答案,那么就及时退出来实现剪枝。

POJ 3134 Power Calculus
https://vjudge.net/problem/POJ-3134

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

int n, maxh;
int a[1005];

int dfs(int x, int cur)//cur表示深度 ,x是当前的次幂 
{
	if (x<<(maxh-cur)<n)	return 0; 
	//乐观估计剪枝,当前深度所对应的x次幂乘2的(maxh-cur)如果小于n,说明深度不够 
	if (cur>maxh)	return 0;
	a[cur]=x;
	if (x==n)	return 1;
	for (int i=0; i<=cur; i++){
		if (dfs(x+a[i], cur+1))	return 1;
		if (dfs(x>a[i]?x-a[i]:a[i]-x, cur+1))//当n等于一个比它大的指数减去一个数情况 
			return 1;
	}
	return 0;
}
int main()
{
	while (scanf("%d", &n) && n){
		maxh=0;
		memset(a, 0, sizeof(a));
		while (!dfs(1, 0)){
			memset(a, 0, sizeof(a));
			maxh++;
		}
		printf("%d\n", maxh);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42172261/article/details/88614751