最近,我一直在尝试编写一些递归迷宫代码,它可以返回迷宫中的最短路径。如果迷宫中没有路径,那么代码将返回-1。
例如,对于董事会:
W-S-
----
--X-
其中S是迷宫的起点,W代表一堵墙,X代表所需的目的地,和-代表一个可用的路径点。输出将是:2
对于董事会:
-SW
-W-
W-X
输出将是-1
这一切都是通过一个board类实现的,该类接受一个字符串和迷宫的尺寸,一个返回最短路径的检查函数,以及一个返回最短路径的win函数,如果没有路径,则返回-1。然而,当我运行代码时,第一个示例的输出为负1,第二个示例的输出为1。
我的代码:
董事会级别:
class Board
{
private char[][] board;
private int maxPath = 9999;
public Board(int rows, int cols, String line)
{
char[][] board1 = new char[rows][cols];
int z = 0;
for(int x = 0; x < rows; x++) {
for(int y = 0; y < cols; y++) {
board1[x][y] = line.charAt(z);
z++;
}
}
board = board1;
}
/** returns the length of the longest possible path in the Board */
public int getMaxPath()
{
return maxPath;
}
public void display()
{
if(board==null)
return;
System.out.println();
for(int a = 0; a<board.length; a++)
{
for(int b = 0; b<board[0].length; b++)
{
System.out.print(board[a][b]);
}
System.out.println();
}
}
/**
* calculates and returns the shortest path from S to X, if it exists
* @param r is the row of "S"
* @param c is the column of "S"
*/
public int check(int r, int c)
{
if(r<0||r > board.length-1||c<0||c>board[0].length-1) {
return maxPath;
}
if(board[r][c] == '*') {
return maxPath;
}
if(board[r][c] == 'W') {
return maxPath;
}
if(board[r][c] == 'X') {
return 0;
}
if(board[r][c] == '-') {
board[r][c] = '*';
}
int up = 1 + check(r-1,c);
int down = 1 + check(r+1,c);
int left = 1 + check(r,c-1);
int right = 1 + check(r,c+1);
board[r][c] = '-';
if(up < down) {
if(up < left) {
if(up < right) {
return up;
}
else {
return right;
}
}
else {
if(left < right) {
return left;
}
else {
return right;
}
}
}
else {
if(down < left) {
if(down < right) {
return down;
}
else {
return right;
}
}
else {
if(left < right) {
return left;
}
else {
return right;
}
}
}
}
/**
* precondition: S and X exist in board
* postcondition: returns either the length of the path
* from S to X, or -1, if no path exists.
*/
public int win()
{
int x = 0;
int y = 0;
int z = 0;
int startRow = 0;
int startCol = 0;
while( x < board.length && z == 0) {
while(y < board[0].length && z == 0) {
if(board[x][y] == 'S') {
z++;
startRow = x;
startCol = y;
}
y++;
}
x++;
}
System.out.println(startRow + " " + startCol);
if(check(startRow,startCol) < maxPath) {
return check(startRow,startCol);
}
else if (check(startRow,startCol) == maxPath) {
return 1;
}
else {
return -1;
}
}
测试用例:
public static void main(String[] args)
{
Board b = null;
b = new Board(3,4,"W-S-------X-");
b.display();
System.out.println("Shortest path is " + b.win()); //2
b = new Board(4,3,"S-W-----X-W-");
b.display();
System.out.println("Shortest path is " + b.win()); //4
b = new Board(3,4,"X-WS--W-W---");
b.display();
System.out.println("Shortest path is " + b.win()); //7
b = new Board(3,5,"W--WW-X----SWWW");
b.display();
System.out.println("Shortest path is " + b.win()); //1
b = new Board(3,3,"-SW-W-W-X"); //no path exists
b.display();
System.out.println("Shortest path is " + b.win()); //-1
b = new Board(5,7,"-W------W-W-WX--S----W----W-W--W---"); //Example Board 1
b.display();
System.out.println("Shortest path is " + b.win()); //5
b = new Board(4,4,"-WX--W-W-WW-S---"); //Example Board -1
b.display();
System.out.println("Shortest path is " + b.win()); //5
//what other test cases should you test?
}
期望的产出:
W-S-
----
--X-
Shortest path is 2
S-W
---
--X
-W-
Shortest path is 4
X-WS
--W-
W---
Shortest path is 7
W--WW
-X---
-SWWW
Shortest path is 1
-SW
-W-
W-X
Shortest path is -1
-W-----
-W-W-WX
--S----
W----W-
W--W---
Shortest path is 5
-WX-
-W-W
-WW-
S---
Shortest path is -1
我的错误输出:
W-S-
----
--X-
Shortest path is -1
S-W
---
--X
-W-
Shortest path is 1
X-WS
--W-
W---
Shortest path is -1
W--WW
-X---
-SWWW
Shortest path is -1
-SW
-W-
W-X
Shortest path is 1
-W-----
-W-W-WX
--S----
W----W-
W--W---
Shortest path is 1
-WX-
-W-W
-WW-
S---
Shortest path is 1
我的新作品大多是正确的:
W-S-
----
--X-
0 2
Shortest path is 2
S-W
---
--X
-W-
0 0
Shortest path is 4
X-WS
--W-
W---
0 3
Shortest path is 7
W--WW
-X---
-SWWW
0 0
Shortest path is 1
-SW
-W-
W-X
0 1
Shortest path is -1
-W-----
-W-W-WX
--S----
W----W-
W--W---
0 0
Shortest path is 9
-WX-
-W-W
-WW-
S---
0 0
Shortest path is -1
有人能解释一下我做错了什么(就在我的新输出和期望的输出之间),以及我如何修复它吗?
编辑:谢谢彼得和mrB,我已经实现了你的建议,并更新了我的代码,以适应!
int right = 1 + check(r-1,c+1);
我强烈怀疑你的意思是:
int right = 1 + check(r,c+1);
你的代码似乎有两个问题。
首先,win()
函数中的while循环将把起始位置留在电路板的左上角。
z==0
这意味着z
其次,
maxPath
从未被赋值。使其0
和所有超出范围的结果(我认为是第一个)成为检查(x,y)
的结果,因为它是10
。-1
结果都是在板的左上角是'W'
或'X'
时得到的,在这种情况下检查(X,y)
返回0
,它等于最大路径
您可能还希望将
check(x,y)
设置为int,而不是再次调用它以返回结果(更大的电路板可能会占用一些资源)。
总之
更新同时循环以分别使用z==0
和增量x
和y
。
设置maxPath
为一个值,例如9999
- 在
win()
中更改条件,以检查check(x, y)
的结果是否为
嗨~我被这个问题困住了。有人请帮帮我!!!! 问题是程序会要求用户输入一个4到20之间的数字来决定迷宫的大小。它稍后会要求用户逐行输入迷宫的内容并将其存储到2D bool数组中(true表示阻塞,false表示清除)。然后程序从左上角开始,并尝试找到一条通往右下角的路径(可以向右、向左、向上、向下移动)。此时,程序还应该维护另一个char数组,该数组记录找到的路径(如果有的话)并在处理结束时打印出
我做了一个递归算法来找到迷宫的解决方案,格式如下 其中一个“#”代表一堵墙,“#”代表一个开放空间(可以自由移动)。”S'代表开始位置,E'代表结束位置。 我的算法运行得很好,但我想知道如何修改它以获得最短路径。 在第一个街区,我找到了那条路并把它打开。还设置了写有路径的char[][]数组,该数组随后作为结果打印出来。 它工作得很好,但是我想知道什么是最好的方法来修改它,使它在找到第一条成功的路
我在用递归解迷宫。我的矩阵是这样的 这是更大矩阵的原型。我的求解递归方法如下所示 你们可以注意到,这里我返回一个布尔值,如果我找到一条路径,它应该会给我一个真值。但它总是给我错误的答案。我不确定我在递归方法中犯的逻辑错误。方法如下 endX=3;endY=10;
我正在尝试寻找到EndPotion的路径。这是一个递归函数。请帮助,我要自杀了。 这是给定的地图 我想递归地使用GetPath来到达上面地图中的EndPotion。参数是当前位置、结束位置和地图。对于这个例子,起始位置是(0,0)和结束,EndPotionis是(0,3),右上角。0代表墙壁,1代表路径。 我需要返回一个包含有效点的arraylist到结束位置。虽然我的数组大小始终为0,并且基本大
本文向大家介绍Java项目实现寻找迷宫出路,包括了Java项目实现寻找迷宫出路的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java实现寻找迷宫出路的具体代码,供大家参考,具体内容如下 项目名称 寻找迷宫出路 项目描述 给定一个自定义迷宫,0表示能通过,1表示不能通过。通过程序找出正确的迷宫出路,并将正确的路线改为2输出。 代码实现 测试类 主类:实现主方法 MazeNode:结点
所以,我有一个作业,要求我用递归解一个迷宫。我会把作业指导贴出来,这样你就能明白我在说什么了。教授没怎么解释递归,他给了我们一些递归的例子,我会发布这些例子,但我希望有人能给我一个更深入的递归解释,以及我如何将其应用于解决迷宫。我不是要求任何人编写代码,我只是希望一些解释能让我走上正确的道路。感谢所有回答的人。 以下是我的例子: 以下是指南: 你要创建一个迷宫爬虫能够解决任何迷宫你给它递归的力量!