A*算法的实现
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<list> 6 #include<string> 7 #include<ctime> 8 #include <algorithm> 9 #include"jsoncpp/json.h" 10 using namespace std; 11 const int n=5; 12 const int dx[4]={-1,0,1,0}; //up,right,down,left 13 const int dy[4]={0,1,0,-1}; 14 int invalid[n][n]={ 15 0,1,0,1,0, 16 0,0,0,1,0, 17 0,0,0,1,0, 18 0,1,0,0,0, 19 0,1,0,1,0 20 }; 21 int tx=4,ty=0,tx1=4,ty1=4; 22 23 struct point 24 { 25 int f,g,h; 26 int x,y; 27 point(int _x=0,int _y=0) 28 { 29 x=_x; 30 y=_y; 31 } 32 }; 33 34 list<point> CloseList; 35 list<point> OpenList; 36 point father[100][100]; //记录路径 37 38 39 bool My_validDirection1(int x,int y) //判断当前移动方向的下一格是否合法 40 { 41 if (x>=n || y>=n || x<0 || y<0) return false; 42 if (invalid[x][y]) return false; 43 return true; 44 } 45 46 47 int As() 48 { 49 point start(tx,ty); 50 point end(tx1,ty1); 51 point tempStart(0,0); //当前点 52 53 OpenList.push_front(start); 54 while(OpenList.size()!=0) 55 { 56 //选出f最小点作为当前点 57 list<point>::iterator it_close=OpenList.begin(); 58 list<point>::iterator it=OpenList.begin(); 59 tempStart=*it; 60 ++it; 61 for(;it!=OpenList.end();++it) 62 { 63 if((*it).f<tempStart.f) 64 { 65 tempStart=*it; 66 it_close=it; 67 } 68 } 69 //将当前点加入关闭列表 70 OpenList.erase(it_close); 71 CloseList.push_front(tempStart); 72 //周围的点进行扩展 73 for(int i=0;i<4;++i) 74 { 75 int exist=0,close=0; 76 point p(tempStart.x+dx[i],tempStart.y+dy[i]); 77 //如果已经存在关闭列表,则不进行操作 78 for(it=CloseList.begin();it!=CloseList.end();++it) 79 { 80 if((*it).x==p.x&&(*it).y==p.y) 81 { 82 close=1; 83 break; 84 } 85 } 86 //如果是非法点或者存在于关闭列表,则不操作 87 if(My_validDirection1(p.x,p.y)&&!close) 88 { 89 for(it=OpenList.begin();it!=OpenList.end();++it) 90 { 91 if((*it).x==p.x&&(*it).y==p.y) 92 { 93 exist=1; 94 break; 95 } 96 } 97 //如果存在于开启列表,则更新fg 98 if(exist) 99 { 100 int g=tempStart.g+1; 101 if(g>p.g) 102 { 103 tempStart=point(father[tempStart.x][tempStart.y].x,father[tempStart.x][tempStart.y].y); 104 p.g=abs(p.x-tempStart.x)+abs(p.y-tempStart.y); 105 p.f=p.g+p.h; 106 } 107 } 108 //否则加入开启列表,计算fgh 109 else 110 { 111 p.g=abs(p.x-tempStart.x)+abs(p.y-tempStart.y); 112 p.h=abs(p.x-tx1)+abs(p.y-ty1); 113 p.f=p.g+p.h; 114 OpenList.push_front(p); 115 father[p.x][p.y]=tempStart; 116 } 117 } 118 } 119 //查询目标点是否在开启列表内 120 for(it=OpenList.begin();it!=OpenList.end();++it) 121 { 122 if((*it).x==tx1&&(*it).y==ty1) 123 { 124 int a=tx1,b=ty1,xx=tx1,yy=ty1; 125 while(father[xx][yy].x!=tx||father[xx][yy].y!=ty) 126 { 127 cout<<xx<<","<<yy<<"<-" ; 128 a=father[xx][yy].x; 129 b=father[xx][yy].y; 130 xx=a;yy=b; 131 } 132 cout<<xx<<","<<yy<<"<-start"; 133 if(xx==tx) 134 { 135 if(yy>ty) 136 {//r2 137 return 1; 138 } 139 else 140 {//l0 141 return 3; 142 } 143 } 144 else 145 { 146 if(xx>tx) 147 {//d1 148 return 2; 149 } 150 else 151 {//u3 152 return 0; 153 } 154 } 155 } 156 } 157 158 } 159 return -1; 160 } 161 //0:left,1:down,2:right,3:up 162 163 int main() 164 { 165 166 int ans=As(); 167 168 // cout<<ans<<endl; 169 170 return 0; 171 }