文档介绍:A*算法概述
A*算法是一种启发式搜索,它的实现方法利用估价函数F(N)找出最接近目标状态的状态,再去搜索,搜索方式类似广度优先搜索。
其特点如图:
黑点就是我们当前已经搜索到的状态,白点(即T点)为目标状态,那么我们就应当选取 int i=0,num=0;
for(i=0;i<9;++i)
if(s[i]!=end[i])
++num;
return num;
}
void init()
{
int i=0;
char a=0;
memset(g,-1,sizeof(g));
memset(h,-1,sizeof(h));
for(i=0;i<9;++i)
{
cin>>now[i];
if(now[i]==0)
p[1].s=i;
}
for(i=0;i<9;++i)
cin>>end[i];
p[1].x=cantor(&now[0]);
p[1].now=cps(&now[0]);
g[p[1].x]=0;h[p[1].x]=h_(&now[0]);
in_[p[1].x]=1;
all=1;
}
void mtd(int x) //维护堆
{
int d=x;
if(x*2<=all && g[p[x*2].x]+h[p[x*2].x]<g[p[d].x]+h[p[d].x])
d=x*2;
if(x*2+1<=all && g[p[x*2+1].x]+h[p[x*2+1].x]<g[p[d].x]+h[p[d].x])
d=x*2+1;
if(d!=x)
{
tmp=p[x],p[x]=p[d],p[d]=tmp;
mtd(d);
}
}
void mtu(int x) //维护堆
{
while(x>1 && g[p[x].x]+h[p[x].x]<g[p[x/2].x]+h[p[x/2].x])
tmp=p[x],p[x]=p[x/2],p[x/2]=tmp,x/=2;
}
void Try(int step)
{
int num=cantor(&now[0]);
if(g[num]==-1 || g[num]>g[]+1)
{
g[num]=g[]+1;
if(in_[num]==0)
{
++all;if(h[num]==-1)h[num]=h_(&now[0]);
p[all].x=num,p[all].now=cps(&now[0]),p[all].s=step;
mtu(all);in_[num]=1;
}
}
return;
}