生成雷场的原理java_java-有障碍的最短路径

我们给定了N x N雷场(二维数组),在另一个M x 2数组中给出了地雷的坐标.在不踩雷场的情况下找到从左上角到右下角最短路径的最佳算法是什么?

解决方法:

G=(V,E)

V = { (x,y) | for all x,y such that (x,y) is not a mine }

E = { ((x1,y1),(x2,y2)) | (x1,y1) is adjacent to (x2,y2) }

现在,有了图后,您需要应用一些最短路径算法.

>最简单的是BFS(因为您的图形未加权).这个

实施起来非常简单,并且始终会找到最快的路径,如果

这样的存在.

>更加复杂的方法是bi-directional BFS.在这里,您从起始节点(0,0)和结束节点(n,n)进行BFS-并在算法的两个前沿相互发现时结束.然后,通过将第一个与第二个相反的部分进行容置来给出路径.这种方法可能比常规BFS更快,但编程起来却有点困难.

>您可以使用诸如曼哈顿距离的启发式算法(如A* search algrotihm)作为启发式函数(假设只能向上/向下/向右/向左走,没有对角线).这可能比这两种方法都快,但更难编码.

如果您没有使用BFS的经验,那么我将从BFS开始,然后再转向更高级的算法.

用伪代码:

BFS(x_source,y_source, x_target,y_target):

queue = empty new queue

queue.add(Pair(x_source,y_source))

parent= new dictionary

parent.add(source, None)

while (queue.empty() == false):

curr = queue.dequeue()

currX = curr.first

currY = curr.second

if (currX == x_target && currY == y_target)

return getPath(dict, curr)

for each neighbor u of curr: //u is a pair of (x,y) coordinates of adjacent cell

if u is not a key in parent:

parent[u] = curr

queue.add(u)

上面的BFS填充了父字典,并且路径由以下getPath()函数返回,该函数基本上遍历字典,直到找到“根”(它是原始源节点)为止.

getPath(dict, target):

sol = [] //empty list

curr = target

while curr != None:

sol.addFirst(curr)

curr = dict.get(curr)

标签:graph-algorithm,java,algorithm

来源: https://codeday.me/bug/20191120/2044964.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值