Java 回溯-在二维网格中找到最优路径
输入: 目标是找到从起点(S)到目标(G)的最佳路径 我们可以向上、向下、向左和向右移动 成本是路径上所有元素的总和 我的想法是使用回溯,但到目前为止,我只找到了一条路径,但它远远不是最优的Java 回溯-在二维网格中找到最优路径,java,recursion,optimization,path-finding,backtracking,Java,Recursion,Optimization,Path Finding,Backtracking,输入: 目标是找到从起点(S)到目标(G)的最佳路径 我们可以向上、向下、向左和向右移动 成本是路径上所有元素的总和 我的想法是使用回溯,但到目前为止,我只找到了一条路径,但它远远不是最优的 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 public List getneights(点p,int[][]网格){ 列表邻居=新建LinkedList(); 如果(p.getX()>0){ 添加(新位置(p.getX()-1,p.getY(
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
public List getneights(点p,int[][]网格){
列表邻居=新建LinkedList();
如果(p.getX()>0){
添加(新位置(p.getX()-1,p.getY());
}
if(p.getX()0){
add(新点(p.getX(),p.getY()-1));
}
if(p.getY()
看一下或其他一些
解决方案可以是这样的:
S
访问的所有节点的新字段值,然后移动到成本值最低的节点。有关动画示例,请参见G
的值,并且您可以使用新字段跟踪成本最低的路径您想要的输出是什么?是这条路吗?还是成本?另外,你似乎正在做DFS,这对我来说是正确的。但似乎你们并没有回溯到目前为止移除路径中存在的任何东西。您只有
路径。addFirst
在使用路径时,请考虑删除最后一个元素。我想输出路径及其成本。您好,谢谢您的回答!实际上我已经试过了,但我想学习回溯also@cmplx96AFAIK回溯实际上不能用于找到最短路径。而且你没有回溯。回溯适用于解决数独或类似问题。
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;
}