八数码第七境界——A*之曼哈顿+康托展开判重+回溯记录路径+逆序数判无解

(请先看前面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个位置。。。

就把所有的相差的位置的横向距离和纵向距离加起来求和,就粗略得出了我们至少应该移动的距离。之后我们在优先队列里,这个距离就是我们判断的依据。


上面这个求距离思想的代码表示

  1. int len(node tmp)  
  2. {  
  3.     int ans=0;  
  4.     for(int i=0;i<9;i++)  
  5.     {  
  6.         if(tmp.str[i]!='x')  
  7.             ans+=abs(i/3-(tmp.str[i]-'0'-1)/3)+abs(i%3-((tmp.str[i]-'0')-1)%3);  
  8.         else  
  9.             ans+=(2-i/3)+(2-i%3);  
  10.     }  
  11.     return ans;  
  12. }  
再给优先队列设置一下判断的依据(就是重写的这个<号)

  1. struct node  
  2. {  
  3.     int r,w,hashnum,pos,num;  
  4.     char str[10];  
  5.     friend bool operator < (node a, node b)  
  6.     {  
  7.         if(a.r==b.r)return a.w > b.w;  
  8.         return a.r > b.r;  
  9.     }  
  10. }tn;  
就行了


全部代码

  1. #define N 512345  
  2.   
  3. char s[10];  
  4. struct node  
  5. {  
  6.     int r,w,hashnum,pos,num;  
  7.     char str[10];  
  8.     friend bool operator < (node a, node b)  
  9.     {  
  10.         if(a.r==b.r)return a.w > b.w;  
  11.         return a.r > b.r;  
  12.     }  
  13. }tn;  
  14. struct res  
  15. {  
  16.     int now,fa;  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值