问题
在n×m的二维方格图s中从beg点移动到end点。s中存在一些黑色的方块阻隔移动。
解法
A*算法是一种启发式搜索(DFS和BFS属于无差别搜索),通过函数f(x)来评价节点x的搜索代价(到目标的距离)。当存在多个待搜索节点时,总是优先搜索那些离目标更最近的点来提高搜索效率。
对于节点x,函数f(x)=g(x)+h(x),其中f(x)表示x点到end的估算/评价距离,g(x)表示从beg节点到x节点需要移动的最短距离,h(x)表示从x点到end节点的估算距离。
设置open表和close表,其中open表类似BFS中的队列,存放待搜索的节点o;close表存放所有已搜索过的节点c,并存储从beg到达c的最短距离g(c)。
初始时将beg推入open和close中,且close[beg]=0,表示beg到达自己的最短距离为1。注意本算法中不会使用染色来标记某个节点是否已经被访问,而是用close表来记录。
每次从open取出节点x,该节点满足f(x)在open中是最小的(若存在多个相同的最小f(x)则随意选取其中一个即可),若x=end则搜索结束;否则考虑将x四周的节点y加入open表中,且显然因为多走了一步有g(y)=g(x)+1=close[x]+1。注意,若close中已经存在y节点,说明在此之前y已经被搜索过,这时比较旧的gold(y)与当前新的gnew(y),显然为了搜索最短路径,若gold(y)>gnew(y)则用新路径替换旧路径,否则忽略节点y不将其加入open表。
当open=∅为空时,说明beg永远无法到达end。
本问题中该算法的时间复杂度为O(n×m)。
八数码问题
源码
测试