我查看了很多线程,发现我认为解决标准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);
}
}
所以我接下来应该尝试什么想法? 感谢
答案 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;