微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DFS 迷宫求解器在正确时返回 false

如何解决DFS 迷宫求解器在正确时返回 false

我目前正在研究一个小型迷宫求解器项目,以更好地掌握深度优先搜索等算法。它的工作原理是将当前位置变为 2,然后检查其中一个位置(向上、向下、向左或向右),如果它是 0(路径),它将向前移动,直到它被单元格包围 1s(墙)然后它是一个死胡同,它回溯。

然而,我的迷宫求解器奇怪地一直返回 false,即使它已经找到了数字 3(结束)。所以我有两个问题,是什么导致它返回 false 以及可以在求解器中更改什么,以便只有最短路径的数字为 2(即,当它回溯时,它会将死胡同变成其他路径)?

提前致谢!

迷宫解算器

import java.util.ArrayList;

public class TestMazeDFS {
    private static int[][] maze = {
            {1,1,1},{1,3,};
    
    public int[][] getMaze(){
        
        return this.maze;
    }
    
    public static void main(String[] args) {
        
        DFS dfs = new DFS(maze);
        boolean test = dfs.solve(1,1);
        System.out.println(test);
        
    }
}

硬编码迷宫

{{1}}

打印时溶液的图像。 Solved Mazehttps://imgur.com/a/UqHP81o

解决方法

快速浏览告诉我你做错了:

        maze[x][y] = 2;
        
        // 3 is the cell the algorithm is supposed to find.
        if (maze[x][y] == 3) { // <-- It will never be 3
            return true;
        }

同样在每个 if-check: if (x > 0 && maze[x-1][y] == 0 && solve (x-1,y) ) { 中,您只访问值为 0 的邻居。因此,出于显而易见的原因,您永远不会访问值为 3 的单元格。 if-check 应该类似于:if (x > 0 && (maze[x-1][y] == 0 || maze[x-1][y] == 3) && solve (x-1,y) ) {

并且请注意,在回溯时,您需要将状态恢复到原始状态。也就是说,当您返回 false 时,maze[x][y] 应该具有原始值。

也许试试这个?

    public boolean solve(int x,int y) {
        // 3 is the cell the algorithm is supposed to find.
        if (maze[x][y] == 3) {
            maze[x][y] = 2;
            return true;
        }

        int orig = maze[x][y];
        maze[x][y] = 2;
        
        // Looks up.
        if (x > 0 && (maze[x-1][y] == 0 || maze[x-1][y] == 3)  && solve (x-1,y) ) {
            //maze[x][y] = 2;
            return true;
        }
        // Looks down
        if (x < maze.length && (maze[x+1][y] == 0 || maze[x+1][y] == 3)  && solve (x+1,y) ) {
            //maze[x][y] = 2;
            return true;
        }
        // Looks right.
        if (y < maze.length && (maze[x][y+1] == 0 || maze[x][y+1] == 3)  && solve (x,y+1) ) {
            //maze[x][y] = 2;
            return true;
        }
        // Looks left.
        if (y > 0 && (maze[x][y-1] == 0 || maze[x][y-1] == 3)  && solve (x,y-1) ) {
            //maze[x][y] = 2;
            return true;
        }

        maze[x][y] = orig;
        return false;
    }

工作解决方案:https://onlinegdb.com/ryxoPKgCaw

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。