前言:
今天兄弟们对“推箱子最短路径算法”大致比较讲究,朋友们都想要知道一些“推箱子最短路径算法”的相关知识。那么小编同时在网摘上汇集了一些有关“推箱子最短路径算法””的相关知识,希望姐妹们能喜欢,各位老铁们快快来了解一下吧!《推箱子游戏》是一款益智游戏,游戏目标是搬运工自己来找出到某个位置的最短路径,然后自己走过去。
地图是这个游戏中非常重要的一部分,关于地图的存储,因为有一部分元素是可以重叠放置的,所以用了一个类似二进制的存储方式,就是4种物件分别有是否存在状态,使得用一个数字可以表示多个物件。
小编整理了一份java学习资料,私信回复【01】,获取源码。
1、是否存在目的地
2、是否存在箱子
3、是否存在人
4、是否存在墙壁
这样就解决了地图存储问题。使用short[][]就存下了。
一、在不移动箱子的情况下其实无论人在哪里对于map来说是没有影响的,所以填充可移动区域可以让需要存储地图的数量有一个大的下降。例如之前那副地图:
8888888
8103018
8002008
8320238
8012108
8403008
8888888
经过变换之后就成了:
8888888
8103018
8002008
8320238
8452108
8443008
8888888
这样就把存储量缩小了四分之三。至于怎样填充,相信对图论有一点了解的都可以随便想出方案,我这里用的是BFS。
话不多说,实现代码如下:
二、关于箱子的移动方式,直接用整幅地图的BFS搜索会比较靠谱。因为可以确定箱子的位置和在不移动箱子情况下人能到的位置,所以箱子可移动的位置也就能确定了,再加上之前存储的所有箱子的位置,这样就能计算出箱子每动作一次地图能更新的情况,一次BFS就是每个箱子往不同可移动位置进行一次移动。
三、结束搜索分为三种情况:
所有目的地被填充完毕-------计算完成退出程序。
有箱子被推到角落并且不是在目的地--------说明不是正确的路线,搜索不再往下走。
当前地图在以前已经被达成过--------说明是重复路线,搜索不再往下走。
四、关于地图的存储,用的是hashSet,并重写了equals和hashCode的实现,用来自动判断地图是否重复。(以此保证不重复)
最后完成地图显示问题,每个节点存储自己父亲节点的地址,当节点发现自己已经完成之后根据地址向上查找直到树顶。
标签: #推箱子最短路径算法