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

Javafx 2D迷宫标准解决方案不起作用,java,algorithm,javafx,maze,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(

我查看了很多线程,发现我认为是标准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);
    }
if(done(r,c)){//if在目标内停止并返回此迷宫
归还这个;
}else if(r>1&&getCell(r-1,c)=''){
集落细胞(r-1,c,“*”);
回归方程(r-1,c);
}else if(r1&&getCell(r,c-1)=''){
集落细胞(r,c-1,'*');
回归方程(r,c-1);
}否则{
返回null;//(r,c);
}
但它并没有射入球门,而是在比赛进行到一半时结束

我猜这是因为这个方法必须返回一些东西,我在最后返回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在目标内停止并返回此迷宫
返回;
}else if(r>1&&getCell(r-1,c)=''){
集落细胞(r-1,c,“*”);
溶剂迷宫(r-1,c);
}else if(r1&&getCell(r,c-1)=''){
集落细胞(r,c-1,'*');
溶剂迷宫(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);
    }
}
if(done(r,c)){//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);
集落细胞(r-1,c,“*”);
回归方程(r-1,c);
}如果(r1&&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);
集落细胞(r,c-1,'*');
回归方程(r,c-1);
}否则{
System.out.println(getCell(r,c)+“r”+r+“c”+c);
返回null;//(r,c);
}
}
你知道我下一步该怎么做吗?
谢谢你的代码以一个特定的优先级解决了这个迷宫,即U、D、R、L,但没有回溯到找到所有的解决方案

根据地图和您的优先级,从一开始,您的代码首先是R(它不能向上或向下),然后在第一次机会时向上,直到它撞到墙上,然后停止(当不再有有效的移动时)

您需要删除不允许回溯的
else if
结构。在回溯过程中,清除该位置(它被标记为
*
,需要恢复回空白)

以下内容应该可以工作,但没有经过测试(您可能需要一个静态布尔
已解决
变量,该变量允许所有递归立即返回:
如果(已解决)返回;

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(已解决)
返回;
if(done(r,c)){//if在目标内停止并返回此迷宫
已解决=正确;
返回;
} 
如果(r>1&&getCell(r-1,c)==“”){//请先尝试
集落细胞(r-1,c,“*”);
溶剂迷宫(r-1,c);
setCell(r-1,c');//将单元格恢复为打开状态并继续尝试
} 
如果(r1&&getCell(r,c-1)=''{//Left
集落细胞(r,c-1,'*');
溶剂迷宫(r,c-1);
集落细胞(r,c-1,');
}
如果(已解决)
返回null;
if(done(r,c)){//if在目标内停止并返回此迷宫
已解决=正确;
返回null;
}
如果(r>1&&getCell(r-1,c)==''”{//Up首先运行
集落细胞(r-1,c,“*”);
溶剂迷宫(r-1,c);
如果(已解决)
返回null;
集落细胞(r-1,c,');
}
如果(r1&&getCell(r,c-1)=''{//Left
集落细胞(r,c-1,'*');
溶剂迷宫(r,c-1);
如果(已解决)
返回null;
集落细胞(r,c-1,');
}
返回null;

我想你的解算器用完了vali
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;