Javafx 2D 迷宫标准解决方案不起作用

Javafx 2D maze standard solution not working

我查看了很多线程,发现我认为是标准 Java 迷宫的解决方案我的 solveMaze 方法是:

    if (done(r, c)) {// if within Goal stop and return this maze
        return this;
    } else if (r > 1 && getCell(r - 1, c) == ' ') {
        setCell(r - 1, c, '*');
        return solveMaze(r - 1, c);
    } else if (r < maxRow - 1 && getCell(r + 1, c) == ' ') {
        setCell(r + 1, c, '*');
        return solveMaze(r + 1, c);
    } else if (c < maxCol - 1 && getCell(r, c + 1) == ' ') {
        setCell(r, c + 1, '*');
        return solveMaze(r, c + 1);

    } else if (c > 1 && getCell(r, c - 1) == ' ') {
        setCell(r, c - 1, '*');
        return solveMaze(r, c - 1);
    } else {
        return null;// solveMaze(r, c);
    }

但它没有达到目标,而是在中途结束 end result of maze

我猜这是因为该方法必须 return 一些东西,而我最后 return null,但我也试图使它成为一个 void 方法并且它做同样的事情.我试图摆脱 r 和 c 的限制,然后我得到数组越界异常。

我只是不明白为什么代码在本质上是标准代码时不起作用。

这里是空的:

    if (done(r, c)) {// if within Goal stop and return this maze
        return ;
    } else if (r > 1 && getCell(r - 1, c) == ' ') {
        setCell(r - 1, c, '*');
         solveMaze(r - 1, c);
    } else if (r < maxRow - 1 && getCell(r + 1, c) == ' ') {
        setCell(r + 1, c, '*');
         solveMaze(r + 1, c);
    } else if (c < maxCol - 1 && getCell(r, c + 1) == ' ') {
        setCell(r, c + 1, '*');
         solveMaze(r, c + 1);

    } else if (c > 1 && getCell(r, c - 1) == ' ') {
        setCell(r, c - 1, '*');
         solveMaze(r, c - 1);
    }

我也试过做不等于,因为墙被指定为 - 和 |我有

    if (done(r, c)) {// if within Goal stop and return this maze
        return this;
    } else if (r > 1 && getCell(r - 1, c) != '|' && getCell(r - 1, c) != '*' && getCell(r, c + 1) != '+'
            && getCell(r, c + 1) != 'S') {
        System.out.println(getCell(r - 1, c) + "r " + r + " c " + c);
        setCell(r - 1, c, '*');
        return solveMaze(r - 1, c);
    } else if (r < maxRow - 1 && getCell(r + 1, c) != '|' && getCell(r + 1, c) != '*' && getCell(r, c + 1) != '+'
            && getCell(r, c + 1) != 'S') {
        System.out.println(getCell(r + 1, c) + "r " + r + " c " + c);
        setCell(r + 1, c, '*');
        return solveMaze(r + 1, c);
    } else if (c < maxCol - 1 && getCell(r, c + 1) != '-' && getCell(r, c + 1) != '*' && getCell(r, c + 1) != '+'
            && getCell(r, c + 1) != 'S') {
        System.out.println(getCell(r, c + 1) + "r " + r + " c " + c);
        setCell(r, c + 1, '*');
        return solveMaze(r, c + 1);

    } else if (c > 1 && getCell(r, c - 1) != '-' && getCell(r, c - 1) != '*' && getCell(r, c + 1) != '+'
            && getCell(r, c + 1) != 'S') {
        System.out.println(getCell(r, c - 1) + "r " + r + " c " + c);
        setCell(r, c - 1, '*');
        return solveMaze(r, c - 1);
    } else {
        System.out.println(getCell(r, c) + "r " + r + " c " + c);
        return null;// solveMaze(r, c);
    }
}

接下来我应该尝试什么? 谢谢

您的代码以特定优先级解决迷宫问题,即 U、D、R、L,但不会回溯找到所有解决方案。

根据地图和您的优先级,您的代码从一开始就先进入 R(它不能向上或向下),然后一有机会就向上,直到撞墙,然后停止(当没有有效动作了)。

您需要删除不允许回溯的 else if 结构。回溯时,清除位置(被标记为*,需要恢复回空space)。

下面应该可以工作,但没有测试(你可能需要一个静态布尔 solved 变量,它允许所有递归到 return 立即:if (solved) return;.

if (solved)
    return;
if (done(r, c)) {// if within Goal stop and return this maze
    solved=true;
    return ;
} 
if (r > 1 && getCell(r - 1, c) == ' ') {  // Try up first
    setCell(r - 1, c, '*');
    solveMaze(r - 1, c);
    setCell(r - 1, c, ' ');  // Restore the cell back to open and keep trying
} 
if (r < maxRow - 1 && getCell(r + 1, c) == ' ') {  // Down
    setCell(r + 1, c, '*');
    solveMaze(r + 1, c);
    setCell(r + 1, c, ' ');  // Restore the cell back to open and keep trying
} 
if (c < maxCol - 1 && getCell(r, c + 1) == ' ') {  // Right
    setCell(r, c + 1, '*');
    solveMaze(r, c + 1);
    setCell(r, c + 1, ' ');
} 
if (c > 1 && getCell(r, c - 1) == ' ') {  // Left
    setCell(r, c - 1, '*');
     solveMaze(r, c - 1);
    setCell(r, c - 1, ' ');
}
if (solved)
        return null;
    if (done(r, c)) {// if within Goal stop and return this maze
        solved = true;
        return null;
    }
    if (r > 1 && getCell(r - 1, c) == ' ') {// Up goes first
        setCell(r - 1, c, '*');
        solveMaze(r - 1, c);
        if (solved)
            return null;
        setCell(r - 1, c, ' ');
    }
    if (r < maxRow - 1 && getCell(r + 1, c) == ' ') {// Down
        setCell(r + 1, c, '*');
        solveMaze(r + 1, c);
        if (solved)
            return null;
        setCell(r + 1, c, ' ');
    }
    if (c < maxCol - 1 && getCell(r, c + 1) == ' ') {// Right
        setCell(r, c + 1, '*');
        solveMaze(r, c + 1);
        if (solved)
            return null;
        setCell(r, c + 1, ' ');
    }
    if (c > 1 && getCell(r, c - 1) == ' ') { // Left
        setCell(r, c - 1, '*');
        solveMaze(r, c - 1);
        if (solved)
            return null;
        setCell(r, c - 1, ' ');
    }

    return null;