Javafx 2D迷宫标准解决方案不起作用
我查看了很多线程,发现我认为是标准Java迷宫的解决方案我的solveMaze方法是: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(
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;