IDA*学习

IDA算法模板(伪代码):

solve(){for maxd:  dfs(0);}
dfs(int d)
{
	if(d==maxd) return check();
	else{
		if(qifa()) return false;
		change the state to the deeper layer;
		if(dfs(d+1)) return false;
		recover the state;
	}
}
下面是一个例子:

UVa11212

注意点为:

1)启发函数是书上的:qifa()+3*d>3*maxd

2)maxd的最大值为8,最小值为0;

3)剪切和粘贴可以看成为相邻两个区间的交换,即swap(a[i..k],a[k+1...j]),此时交换的时间复杂度为O(1/6*n^4)

4)注意计算启发函数的时候应该加上头部元素,将头元素看为一个虚拟元素的后继节点

下面是代码:

#include 
#include 
#include 
using namespace std;
const int maxn = 10;
int n;
int a[maxn];
int maxd;
bool check()
{
	for(int i = 1;i3*maxd) return false;
		int tmp[maxn];
		int pa[maxn];
		memcpy(pa,a,sizeof(a));
		for(int i = 0;i

谢谢大家的阅读。


你可能感兴趣的:(算法)