我想用递归法解迷宫。在下面的代码中,MazeCord是程序员创建的类型,它存储坐标类型位置。格式为mazecord(int x,int y)。现在编译时,我的程序会到达方法的某些部分,而忽略另一部分,因此在所有情况下都会显示“未找到路径”,并且只在LinkedList mazePath中存储开始位置。search()方法中有一个被注释掉的部分,这是我尝试的另一种方法,但我很确定它是错误的,不是这样做的。
感谢您的帮助。
递归代码:
/**返回迷宫中的路径。第一个元素是起始位置,最后一个元素是退出位置。如果没有路径,或者在搜索之前调用了路径,则返回空列表。
@返回迷宫路径*/
public LinkedList<MazeCoord> getPath() {
return mazePath;
}
/**如果有迷宫的话,找一条穿过迷宫的路。客户端可以访问通过getPath方法找到的路径@返回是否找到路径*/
public boolean search() {
currentLoc = new MazeCoord(startLoc.getRow(), startLoc.getCol());
visitedPath = new boolean[mazeData.length][mazeData[0].length];
mazePath=new LinkedList<MazeCoord>();
if(hasWallAt(startLoc) || hasWallAt(endLoc)){
return false;
}
else{
mazePath.add(currentLoc);
return appendToSearch(currentLoc.getRow(), currentLoc.getCol());
}
/**
System.out.println("try1");
mazePath.add(new MazeCoord(startLoc.getRow(), startLoc.getCol()));
boolean searchResult = appendToSearch(numRows()-1, numCols()-1);
System.out.println("test: " + searchResult);
System.out.println("test2: row, col --> " + (numRows()-1) + " , " + (numCols()-1));
System.out.println("test3: wallValue:" + hasWallAt(new MazeCoord(numRows()-1,numCols()-1)));
if(searchResult){
System.out.println("try2");
mazePath.add(new MazeCoord(numRows()-1, numCols()-1));
}
return searchResult;
*/
}
/**search()方法的Helper函数,该函数将执行实际递归,以获取通过maze@param行的路径currentLoc@param col的行currentLoc@return true的列(如果路径可用)*/
private boolean appendToSearch(int row, int col) {
//Check if within the maze
if((row - 1 < 0) || (col - 1 < 0) || (row + 1 > numRows()) || (col + 1 > numCols())){
return false;
}
//Check if the position is the exit location
if(row == endLoc.getRow() && col == endLoc.getCol()){
mazePath.add(new MazeCoord(row, col));
return false;
}
//Check for Wall
if(hasWallAt(new MazeCoord(row, col))){
return false;
}
//Check if the position has already been visited
if(visitedPath[row][col]){
return false;
}
//If all pass --> add to visitedPath
visitedPath[row][col]=true;
//Check to the Right
if(appendToSearch(row, col + 1)){
mazePath.add(new MazeCoord(row, col + 1));
return true;
}
//Check Downwards
else if(appendToSearch(row + 1, col)){
mazePath.add(new MazeCoord(row + 1, col));
return true;
}
//Check to the Left
else if(appendToSearch(row, col - 1)){
mazePath.add(new MazeCoord(row, col - 1));
return true;
}
//Check Upwards
else if(appendToSearch(row - 1, col)){
mazePath.add(new MazeCoord(row - 1, col));
return true;
}
return false;
}
首先,我想建议你这个链接,它解释了最常见的寻路算法之一。
我认为这篇教程将非常适合你的要求,因为它以网格为例。
不需要使用递归函数来执行寻路算法。您可以保存两个列表:一个是已经“检查”的单元格/磁贴,另一个是尚未检查的单元格/磁贴。
依次从要开始路径的点开始,并检查从该点可以到达的所有单元格/分幅,如:
void addCells(Point current) {
// Left
if (emptyAndNotChecked(current.x-1,current.y)) // Checking for walls here
cellsToCheck.add(new Point(x-1,y)) // Adding this cell to the list
// Right
if (emptyAndNotChecked(current.x+1,current.y))
cellsToCheck.add(new Point(x+1,y))
// Top
if (emptyAndNotChecked(current.x,current.y+1))
cellsToCheck.add(new Point(x,y+1))
// Bottom
if (emptyAndNotChecked(current.x,current.y-1))
cellsToCheck.add(new Point(x,y-1))
}
其中emptyAndNotChecked()
只检查给定位置是否不是墙,并且尚未检查。当然,你也可以进行对角线检查!
此时,您想从要添加更多单元格的位置找到下一个单元格/磁贴,您可以通过检查所有“未检查”的单元格/磁贴并应用于每个“权重”函数来做到这一点,该函数将为您提供给定目的地的最佳单元格/磁贴,基本实现可能是这样的:
float weight(Point current,Point end) {
return Math.sqrt(Math.pow(current.x-end.x,2)+Math.pow(current.y-end.y,2));
}
此函数将允许您找到要导航到的最合适的单元格/磁贴,一旦找到它(权重最低的单元格/磁贴),您将移动到此函数并再次调用第一个函数以添加更多单元格/磁贴。
当移动到的单元格/磁贴是目标时,或者在调用addCells()
时,如果不添加任何新的单元格/磁贴,则将停止。
当然,这只是一种基本的方法,可以应用很多改进。希望这有帮助!
嗨~我被这个问题困住了。有人请帮帮我!!!! 问题是程序会要求用户输入一个4到20之间的数字来决定迷宫的大小。它稍后会要求用户逐行输入迷宫的内容并将其存储到2D bool数组中(true表示阻塞,false表示清除)。然后程序从左上角开始,并尝试找到一条通往右下角的路径(可以向右、向左、向上、向下移动)。此时,程序还应该维护另一个char数组,该数组记录找到的路径(如果有的话)并在处理结束时打印出
最近,我一直在尝试编写一些递归迷宫代码,它可以返回迷宫中的最短路径。如果迷宫中没有路径,那么代码将返回-1。 例如,对于董事会: 其中S是迷宫的起点,W代表一堵墙,X代表所需的目的地,和-代表一个可用的路径点。输出将是: 对于董事会: 输出将是 这一切都是通过一个board类实现的,该类接受一个字符串和迷宫的尺寸,一个返回最短路径的检查函数,以及一个返回最短路径的win函数,如果没有路径,则返回-
本文向大家介绍Java项目实现寻找迷宫出路,包括了Java项目实现寻找迷宫出路的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java实现寻找迷宫出路的具体代码,供大家参考,具体内容如下 项目名称 寻找迷宫出路 项目描述 给定一个自定义迷宫,0表示能通过,1表示不能通过。通过程序找出正确的迷宫出路,并将正确的路线改为2输出。 代码实现 测试类 主类:实现主方法 MazeNode:结点
主要内容:回溯算法解决迷宫问题迷宫问题指的是:在给定区域内,找到一条甚至所有从某个位置到另一个位置的移动路线。举个简单的例子,如图 1 所示,在白色区域内找到一条(甚至所有)从起点到终点的路线。 图 1 迷宫问题 迷宫问题就可以采用 回溯算法解决,即从起点开始,采用不断“回溯”的方式逐一试探所有的移动路线,最终找到可以到达终点的路线。 回溯算法解决迷宫问题 以图 1 所示的迷宫为例,回溯算法解决此问题的具体思路是: 从当前位置
这里, S=起点(2,2) B=块 O=打开 X=出口 我想做一个迷宫,可以检查北部,西部,东部和南部。如果X在附近,它将返回程序。如果没有,则检查起点周围的任何“O”,并以递归方式传递新的起点。它没有办法去,“X”没有找到,它将回到原来的起点(2,2)并检查西部,东部和南部。 节目结束后,我得到了: 但是,我期望递归后的输出是: 这是我现在的代码: startX和startY是起点的索引。 我不
我正在尝试寻找到EndPotion的路径。这是一个递归函数。请帮助,我要自杀了。 这是给定的地图 我想递归地使用GetPath来到达上面地图中的EndPotion。参数是当前位置、结束位置和地图。对于这个例子,起始位置是(0,0)和结束,EndPotionis是(0,3),右上角。0代表墙壁,1代表路径。 我需要返回一个包含有效点的arraylist到结束位置。虽然我的数组大小始终为0,并且基本大