(请先看前面6大境界)
A*其实就是以bfs为基础的,就是给了bfs一些条件,让它以优先队列的形式进行。
想快速掌握A*可以看http://blog.csdn.net/qq_36523667/article/details/78786160
A*有两种距离计算公式:
一种是曼哈顿距离:横向距离+纵向距离
一种是欧氏距离:两点间的直线距离
我们这里使用的是曼哈顿距离。
我们希望的路径假设是
4 8 7
1 2 x
5 6 3
我们的结束路径是
1 2 3
4 5 6
7 8 x
我们看到希望的路径和假设的路径1,相差1个位置,
2,相差1个位置,3相差2个位置。。。
就把所有的相差的位置的横向距离和纵向距离加起来求和,就粗略得出了我们至少应该移动的距离。之后我们在优先队列里,这个距离就是我们判断的依据。
上面这个求距离思想的代码表示
- int len(node tmp)
- {
- int ans=0;
- for(int i=0;i<9;i++)
- {
- if(tmp.str[i]!='x')
- ans+=abs(i/3-(tmp.str[i]-'0'-1)/3)+abs(i%3-((tmp.str[i]-'0')-1)%3);
- else
- ans+=(2-i/3)+(2-i%3);
- }
- return ans;
- }
- struct node
- {
- int r,w,hashnum,pos,num;
- char str[10];
- friend bool operator < (node a, node b)
- {
- if(a.r==b.r)return a.w > b.w;
- return a.r > b.r;
- }
- }tn;
全部代码
- #define N 512345
- char s[10];
- struct node
- {
- int r,w,hashnum,pos,num;
- char str[10];
- friend bool operator < (node a, node b)
- {
- if(a.r==b.r)return a.w > b.w;
- return a.r > b.r;
- }
- }tn;
- struct res
- {
- int now,fa;