如何仅显示在Java中退出迷宫的正确路线?

时间:2018-11-28 18:07:26

标签: java for-loop

因此,我创建了一个迷宫求解器,该迷宫求解器可以找到到达终点的路线,但是我该怎么做,以便如果一条路线通向死角,则将其重写为空白。下面是我的求解器迷宫方法。

谢谢大家,@ Leo Aso的解决方案成功了。

   private boolean solveMaze(int coorda, int coordb) { 
    return solveMaze(coorda, coordb, 0, 0);
}

private boolean solveMaze(int coorda, int coordb, int dx, int dy) { 

    switch (myMaze[coorda][coordb]) {
        case '#': case 'X': return false;
        case 'E': return true;
    }

    myMaze[coorda][coordb] = 'X';

    if (dx >= 0 && solveMaze(coorda + 1, coordb, +1, 0) || // W
        dx <= 0 && solveMaze(coorda - 1, coordb, -1, 0) || // E
        dy >= 0 && solveMaze(coorda, coordb + 1, 0, +1) || // S
        dy <= 0 && solveMaze(coorda, coordb - 1, 0, -1)) { // N
        return true;
    }       

    myMaze[coorda][coordb] = ' ';
    return false;
}

2 个答案:

答案 0 :(得分:1)

尝试一下,看看是否可行。

private boolean solveMaze(int coorda, int coordb) { 
    return solveMaze(coorda, coordb, 0, 0);
}

private boolean solveMaze(int coorda, int coordb, int dx, int dy) { 

    switch (myMaze[coorda][coordb]) {
        case '#': case 'X': return false;
        case 'E': return true;
    }

    myMaze[coorda][coordb] = 'X';

    if (dx >= 0 && solveMaze(coorda + 1, coordb, +1, 0) || // W
        dx <= 0 && solveMaze(coorda - 1, coordb, -1, 0) || // E
        dy >= 0 && solveMaze(coorda, coordb + 1, 0, +1) || // S
        dy <= 0 && solveMaze(coorda, coordb - 1, 0, -1)) { // N
        return true;
    }       

    myMaze[coorda][coordb] = ' ';
    return false;
}

您遇到的问题是,您不能确保不允许递归返回原先的方向。如果允许,则 all 路径均会导致退出,因为转身是有效的举动。这就是dxdy进入的地方。当您向东/向西移动时,dx为+ 1 / -1,而当您向北/向南移动时,dy为-1 / + 1。大if语句可确保您不会只是朝那个方向前进,例如如果您只是向西移动,就不要向东移动。

答案 1 :(得分:-1)

您也许可以编写一个if语句来了解什么是死胡同。因此,它将主要搜索三个不同方向为“#”的位置。然后,您可能会有一条if语句,如果deadend为true,则追溯步骤并删除x值。