我们得到N×N雷区(2d阵列),在另一个M×2阵列中给出了地雷的坐标。什么是找到从左上角到右下角的最短路径的最佳算法,而不是踩在雷区的矿井上?
答案 0 :(得分:2)
这是shortest path problem,可以通过将问题减少到graph来解决:
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开始,然后转向更高级的alrefithms。
在伪代码中:
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填充parent
字典,并且路径由以下getPath()函数返回,该函数基本上遍历字典,直到找到“root”(原始源节点)。 / p>
getPath(dict, target):
sol = [] //empty list
curr = target
while curr != None:
sol.addFirst(curr)
curr = dict.get(curr)
答案 1 :(得分:1)
使用dijkstra算法可以解决这个问题。 首先删除所有到Mine节点的传入路径,然后以最短路径前进到右下角节点。