A*算法的实现

时间:2021-07-10 16:41:49
 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<list>
#include<string>
#include<ctime>
#include <algorithm>
#include"jsoncpp/json.h"
using namespace std;
const int n=;
const int dx[]={-,,,}; //up,right,down,left
const int dy[]={,,,-};
int invalid[n][n]={
,,,,,
,,,,,
,,,,,
,,,,,
,,,,
};
int tx=,ty=,tx1=,ty1=; struct point
{
int f,g,h;
int x,y;
point(int _x=,int _y=)
{
x=_x;
y=_y;
}
}; list<point> CloseList;
list<point> OpenList;
point father[][]; //记录路径 bool My_validDirection1(int x,int y) //判断当前移动方向的下一格是否合法
{
if (x>=n || y>=n || x< || y<) return false;
if (invalid[x][y]) return false;
return true;
} int As()
{
point start(tx,ty);
point end(tx1,ty1);
point tempStart(,); //当前点 OpenList.push_front(start);
while(OpenList.size()!=)
{
//选出f最小点作为当前点
list<point>::iterator it_close=OpenList.begin();
list<point>::iterator it=OpenList.begin();
tempStart=*it;
++it;
for(;it!=OpenList.end();++it)
{
if((*it).f<tempStart.f)
{
tempStart=*it;
it_close=it;
}
}
//将当前点加入关闭列表
OpenList.erase(it_close);
CloseList.push_front(tempStart);
//周围的点进行扩展
for(int i=;i<;++i)
{
int exist=,close=;
point p(tempStart.x+dx[i],tempStart.y+dy[i]);
//如果已经存在关闭列表,则不进行操作
for(it=CloseList.begin();it!=CloseList.end();++it)
{
if((*it).x==p.x&&(*it).y==p.y)
{
close=;
break;
}
}
//如果是非法点或者存在于关闭列表,则不操作
if(My_validDirection1(p.x,p.y)&&!close)
{
for(it=OpenList.begin();it!=OpenList.end();++it)
{
if((*it).x==p.x&&(*it).y==p.y)
{
exist=;
break;
}
}
//如果存在于开启列表,则更新fg
if(exist)
{
int g=tempStart.g+;
if(g>p.g)
{
tempStart=point(father[tempStart.x][tempStart.y].x,father[tempStart.x][tempStart.y].y);
p.g=abs(p.x-tempStart.x)+abs(p.y-tempStart.y);
p.f=p.g+p.h;
}
}
//否则加入开启列表,计算fgh
else
{
p.g=abs(p.x-tempStart.x)+abs(p.y-tempStart.y);
p.h=abs(p.x-tx1)+abs(p.y-ty1);
p.f=p.g+p.h;
OpenList.push_front(p);
father[p.x][p.y]=tempStart;
}
}
}
//查询目标点是否在开启列表内
for(it=OpenList.begin();it!=OpenList.end();++it)
{
if((*it).x==tx1&&(*it).y==ty1)
{
int a=tx1,b=ty1,xx=tx1,yy=ty1;
while(father[xx][yy].x!=tx||father[xx][yy].y!=ty)
{
cout<<xx<<","<<yy<<"<-" ;
a=father[xx][yy].x;
b=father[xx][yy].y;
xx=a;yy=b;
}
cout<<xx<<","<<yy<<"<-start";
if(xx==tx)
{
if(yy>ty)
{//r2
return ;
}
else
{//l0
return ;
}
}
else
{
if(xx>tx)
{//d1
return ;
}
else
{//u3
return ;
}
}
}
} }
return -;
}
//0:left,1:down,2:right,3:up int main()
{ int ans=As(); // cout<<ans<<endl; return ;
}