- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以我的任务是创建一个迷宫解算器,其中包含一个队列、一个集合、一个位置对象和最终形成一个迷宫对象的单元格对象。
快速浏览一下我完成后所有代码的基本功能:
7
10
_ _ _ _ _ _ _ _ _
|_ _ _ | _ _ _ |
| _ _| | | _ | |
| | | |_| | | |_| |
|_ _|_ _ _| |_ | |
| _ | | _ _| |_|
| |_ _| _| |_ |
|_ _ _ _|_ _|_ _ _| |
进入这个:
@ _ _ _ _ _ _ _ _ _
|@ @ @ @| _ _ _ |
| _ _|@| |@ @ @| |
| | |@|_|@| |@|_| |
|_ _|_ @ @ @| |@ @| |
| _ | | _ _|@|_|
| |_ _| _| |_ @ @|
|_ _ _ _|_ _|_ _ _|@|
@
到目前为止,我所做的一切都很好,但是当我开始对迷宫对象中的 findPath() 方法进行实际编码时,我的代码生成了一条无效的路径。当我接收一个文件来读取迷宫时,我将该迷宫转换为一个多维字符数组,然后将该字符数组转换为一个多维单元格数组,并将每个单元格的北、南、东、西边界映射为 boolean 值。
现在要真正弄清楚如何在迷宫中导航,我曾在 Maze 的 findPath() 方法中尝试过,但实际上有点失败。
@ @ @ @ . . . . . .
. . . @ . . . . . .
. @ @ @ . . . . . .
. @ @ @ @ . . . . .
. . @ @ @ . . . . .
. @ @ @ @ . . . . .
. . . . . . . . . .
首先,为了说明我应该实现的目标,让我让您看一下我的需求文档:
The algorithm operates according to the following pseudo-code:
* Visit the starting Location.
* Add this Location to the set.
* Enqueue the Location in the queue.
while (ArrayQueue<E> != empty( ))
{
Dequeue a Location(next) from the queue
For each neighbor of Location(next) which has
not yet been placed in the set, repeat:
* Visit the neighbor of Location(next).
* Add the neighbor of Location(next) to the Set.
* Enqueue the neighbor of Location(next)in the Queue.
}
我几乎可以肯定我在某种程度上正确地使用了他的算法,但我无法弄清楚我做错了什么以获得我遇到的路径。我最头疼的是我在下面包含的 Maze 对象的 findPath() 方法。我想我最大的问题是我做错了什么?我已经在这里待了好几天了,只是想不通。任何帮助表示赞赏。我的代码如下:
My Maze 的查找路径方法
public void findPath()
{
Location startLocation = new Location(0, 0);
theMaze[startLocation.getRow()][startLocation.getColumn()].setVisited(true);
Location endLocation = new Location(6, 9);
Location cursor;
locationQueue.enqueue(startLocation);
locationSet.enter(startLocation);
while(!locationQueue.isEmpty())
{
cursor = locationQueue.dequeue();
if(cursor == endLocation)
break;
for(int i = 0; i < 4; i++)
{
Location temp = cursor.getLoc(i);
if(theMaze[cursor.getRow()][cursor.getColumn()].validDirection(i) && (!locationSet.isElement(temp)) && !(theMaze[temp.getRow()][temp.getColumn()].isVisited()))
{
cursor = cursor.getLoc(i);
theMaze[cursor.getRow()][cursor.getColumn()].setVisited(true);
if(theMaze[cursor.getColumn()][cursor.getColumn()].getPathAmount() < 2)
{
cursor = startLocation;
continue;
}
locationSet.enter(cursor);
locationQueue.enqueue(cursor);
}
}
}
for(int i = 0; i < locationSet.size(); i++)
{
System.out.println("Row " + locationSet.get(i).getRow() + " Column " + locationSet.get(i).getColumn());
theMaze[locationSet.get(i).getRow()][locationSet.get(i).getColumn()].setPath();
}
for(int i = 0; i < theMaze.length; i++)
{
for(int j = 0; j < theMaze[i].length; j++)
{
System.out.print(theMaze[i][j].toString());
}
System.out.print("\n");
}
}
编辑:我的问题出在 Maze 对象上,而不是其他类,所以我基本上是在清理。
最佳答案
您的基本算法存在缺陷。您只需将单元格添加到路径中,但如果它们变成死胡同,则不要删除它们。
这类问题最适合递归算法。
function findExit(gameMap, listOfVisitedCells, currentCell, solution)
listOfVisitedCells.add(currentCell);
for each gameMap.NeighbourOf(currentCell)
if neighbour not in listOfVisitedCells
solution.add(neighbour)
if (gameMap.isExit(neighbour)) {
return true;
}
if (findExit(gameMap, listOfVisitedCells, currentCell, solution)) {
return true;
}
solution.remove(neighbour);
}
}
// No neighbours of the current cell got to find the exit.
return false;
}
当然,这将以深度优先的方式探索 map ,因此如果有多条路径有效,则不能保证找到最短的路径(为此使用 Djikstra 算法)。
更新:通过审查您的代码:
很难在头脑中调试这么多行代码,并且 SO 不能代替您花费大量时间使用您选择的调试器,观察程序的实际状态与预期状态,等等。不要期望太多,SO 更适合于代码量有限的具体问题(“我希望这段代码能做到这一点,但它没有,为什么”)。
无论如何,这让我觉得很奇怪:
Location temp = cursor.getLoc(i);
if(theMaze[cursor.getRow()][cursor.getColumn()].validDirection(i) && (!locationSet.isElement(temp)) && !(theMaze[temp.getRow()][temp.getColumn()].isVisited()))
{
cursor = cursor.getLoc(i); <-- Why are you overwritting the current
<-- location when you have still not checked
<-- all the posible directions?
theMaze[cursor.getRow()][cursor.getColumn()].setVisited(true);
if(theMaze[cursor.getColumn()][cursor.getColumn()].getPathAmount() < 2)
{
cursor = startLocation;
continue;
}
locationSet.enter(cursor);
locationQueue.enqueue(cursor);
}
我敢打赌这是不正确的。当然,可能还隐藏着其他问题,最好是自己调试一下,找到没有按预期工作的片段(然后,如果需要,在SO中寻求帮助)。
关于Java Maze Solver - 我从来没有这么卡过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15807137/
打开几个编写宏/代码的示例,我突然被一个似乎安全的代码卡住了。求解器 (SOLVER.XLAM) 这是值得注意的,我想从我的系统中删除它。我想这不是一个相关的代码。谁能告诉我我应该怎么做?我已经安装了
是否可以使用 MSF api 将变量指定为半整数(V = 0 或 a = 5; Q1 = 5; Q2 10 * VPositive<= V <= 20 * VPositive ] ] 如果您使用
我正在研究线性和非线性编程(优化)框架的选项。 要求是: 支持大约线性和非线性规划问题。 100-1000 个变量和最多约 1000 个约束(我认为这很简单)。非线性问题具有涉及多个变量的乘法或除法的
SMT-Solver 可用于约束求解。众所周知,CSP 求解器也用于约束求解多年。那么 SMT 求解器与 CSP 求解器相比有什么优势呢? 最佳答案 这完全取决于你想做什么。您可以将两者都转换为 SA
我正在查看 Caffe LeNet 教程 here我想到了一个问题: 这两个代码有什么区别: self.solver.step(1) 和 self.solver.net.forward() # tr
我正在使用 CBC 求解器在 PyCharm 上解决优化问题,但一直遇到此错误: 错误:求解器 (cbc) 返回非零返回代码 (3221225781) 和 pyutilib.common._excep
我是 microsoft excels 求解器的用户,我很确定不可能求解最大化两个值。我想知道是否有人可能有另一种聪明的方法来做到这一点。 基本上,我有一列介于 1 到 30 之间的数字,我需要查看它
我想从数值的角度理解混合建模(特别是状态事件)背后的一般思想(尽管我不是数学家 :))。鉴于以下 Modelica 模型: model BouncingBall constant Real g
最近,我开始研究形式验证技术。在文献中,模型检查器和求解器可以以某种方式互换使用。 但是,模型检查器和求解器如何相互连接? p.s.如果建议提供一些论文或链接,我将不胜感激。 最佳答案 为了执行模型检
我希望这对某人来说是显而易见的。我只使用过 GLPK/MathProg。 我无法弄清楚 GNU MathProg(在 GLPK 内)中的语法来执行以下操作,例如: set PartsOfWeek; s
我有一个(对我来说)非常复杂的问题。我有两个向量: vectora <- c(111, 245, 379, 516, 671) vectorb <- c(38, 54, 62, 67, 108) 此外
我在 VBA 循环中使用 Excel 2007 中的内置求解器来解决许多不同的问题。有时,求解器会达到最大时间,这会导致出现弹出对话框,询问用户是否要继续、停止或结束。在所有情况下,我都希望它结束
我在 PC 上的 Excel 2010 中创建了一个程序,该程序依赖于 Excel 的内置求解器。我确保它适用于 PC 版 Excel 2010 和 Excel 2013。然后我尝试在 Excel 2
在汽车行业,当您购买汽车时,您有数千种不同的组件可供选择。并非每个组件都是可组合的,因此对于每辆汽车,都存在许多用命题逻辑表达的规则。就我而言,每辆车都有 2000 到 4000 条规则。 它们看起来
有没有办法让我们知道解算器中添加了多少约束?例如,我们初始化一个 z3 求解器 s = Solver(),然后使用 s.add() 添加约束。我们如何获得最终添加到求解器中的约束数量? 最佳答案 您可
我正在尝试修改 ceres 的默认行为,即计算残差的平方和作为成本函数。我希望它只计算总和(残差已经以只能为正的方式计算) 根据文档,我应该使用 ConditionedCostFunction 这是我
我有这个方法来求解根据增量返回 2 种类型数组的二次方程(如果小于零则有复数解) public static final String[] quadEquationSolver(double a, d
p = Int('p') q = Int('q') s = Solver() s.add(1<=p<=9, 1<=q<=19, 5<(3*p-4*q)<10) s.check() print s.mo
“问题”在标题中不应该是问题的情况。 我想为一组问题(类 Problem 的所有子项)实现一个求解器(类 Solver),这些问题或多或少共享同一组方法。我目前的设计是这样的: 在solver.h :
我为所有方向创建了一个单词求解器。它可以水平、垂直和反向查找单词。然而,我在让它走向各个方向时遇到了问题。所以把“你好”放在: H E i l x L p q c L O m 任何人
我是一名优秀的程序员,十分优秀!