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

时间:2018-04-15 19:55:26

标签: java algorithm javafx maze

我查看了很多线程,发现我认为解决标准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

我猜这是因为该方法必须返回一些东西并且我最后返回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);
    }
}

所以我接下来应该尝试什么想法? 感谢

2 个答案:

答案 0 :(得分:0)

你所拥有的代码解决了具有特定优先级的迷宫,即U,D,R,L,但不会回溯以找到所有解决方案。

根据地图和您的优先级,从一开始您的代码首先是R(它不能上升或下降),然后是第一次机会直到它达到墙壁,然后停止(当没有有​​效的运动时)了)。

您需要删除不允许回溯的else if结构。在回溯期间,清除位置(它被标记为*,它需要恢复到空白区域。)

以下内容应该有效,但未经过测试(您可能需要一个静态布尔solved变量,它允许所有递归立即返回: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, ' ');
}

答案 1 :(得分:0)

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;