gpt4 book ai didi

java - 回溯 - 在二维网格中找到最佳路径

转载 作者:行者123 更新时间:2023-12-02 11:34:07 28 4
gpt4 key购买 nike

输入:

3,4,8,7,3
5,S,7,2,3,
8,5,5,8,10
9,3,3,8,7
6,10,3,G,1

目标是找到从起点(S)到目标(G)的最佳路径。

我们可以向上、向下、向左、向右移动。

成本是路径上所有元素的总和。

我的想法是使用回溯,但到目前为止我只找到了一条路径,但它远非最佳。

public List<Point> getNeighbours(Point p, int[][] grid) {
List<Point> neighbours = new LinkedList<>();
if (p.getX() > 0) {
neighbours.add(new Position(p.getX() - 1, p.getY()));
}
if (p.getX() < grid.length - 1) {
neighbours.add(new Position(p.getX() + 1, p.getY()));
}
if (p.getY() > 0) {
neighbours.add(new Point(p.getX(), p.getY() - 1));
}
if (p.getY() < grid[p.getX()].length - 1) {
neighbours.add(new Point(p.getX(), p.getY() + 1));
}
return neighbours;
}

private class IntBox {
int value;

public IntBox(int value) {
this.value = value;
}

}

private boolean findPath(int[][] grid, Point current, Point goal LinkedList<Point> path, Set<Point> visited, IntBox minDist, int dist) {
if (current.getX() == goal.getX() && current.getY() == goal.getY()) {
minDist.value = Math.min(dist, minDist.value);
return true;
}
for (Point neighbour : getNeighbours(current, grid)) {
if (visited.contains(neighbour)) {
continue;
}
visited.add(nachbar);
if (findPath(grid, neighbour, goal, path, visited, minDist, dist+grid[neighbour.getX()][neighbour.getY()])) {
path.addFirst(nachbar);
return true;
}
}
return false;
}

最佳答案

看看Dijkstra's algorithm或其他shortest path problem solutions .

解决方案可能是这样的:

  1. 网格中的每个节点都会有两个额外字段 - 从起点开始的最小成本和通向起点的最近节点(在最小成本路径上)。
  2. 计算可从 S 直接访问的所有节点的新字段值,然后移动到具有最低最小成本值的节点。有关动画示例,请参阅 Wikipedia .
  3. 当您计算所有节点的值时,您也会得到一个 G 值,并且您可以使用新字段跟踪成本最低的路径。

关于java - 回溯 - 在二维网格中找到最佳路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49071556/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com