我有一个搜索迷宫的程序,以找到最好的出路。在搜索时,它会将下一步移动添加到数组中。我的问题是它一遍又一遍地重复相同的三个动作。我需要找到检查移动数组的最佳方法,以便在检测到循环时强制它改变移动。
为了清晰起见,编辑 http://www.logicmazes.com/theseus.html迷宫三是我正在测试的那个。会发生什么事情,它会在它开始的列中上下移动。
答案 0 :(得分:1)
您可以跟踪当前路径已经访问过的每个单元格,而不是再次访问这些单元格(因为这会创建一个循环)。
就数据结构而言,我看到两种主要可能性:
true
。无论何时采取步骤,无论何时回溯,都需要更新结构。
答案 1 :(得分:0)
如果您正在使用数组,那么您应该能够使用“包含”方法来检查移动是否已经在数组中。
为了做到这一点,你可能需要修改你的equals方法来比较两个不同的动作来检查它们是否相同。
在这种情况下,当您识别出相同的动作时,您可以忽略它并寻找其他动作。示例伪代码
public class Move {
int x;
int y;
public boolean equals(Object o){
if(o == null) return false;
if(!(o instanceof) Move) return false;
Move other = (Move) o;
if(this.x != other.x) return false;
if(this.y != other.y) return false;
return true;
}
}
public class SolveMaze {
List<Move> moves;
...
public boolean isValidMove(Move move) {
if (moves.contains(move)) return false;
else {
...
moves.add(move);
}
}
}
答案 2 :(得分:0)
听起来问题是你的“状态”实际上并没有包含足够的状态信息。在每个周期中,在忒修斯移动并且牛头怪已经移动两次之后,该州包含以下内容:
您可以将这些表示为某种MazeState
对象,equals
和hashCode
方法可以让您轻松查看两个实例是否代表相同的状态。
由于Minotaur的动作遵循一个非常严格的程序,因此Theseus所做的每一个动作(左/右/上/下/延迟)将从一个明确定义的状态移动到另一个明确定义的状态。然后你需要禁止Theseus做出任何动作:
为此,您可以将先前的状态存储在HashSet<MazeState>
。