Java搜索数组重复模式

时间:2012-03-23 20:10:35

标签: java arrays design-patterns

我有一个搜索迷宫的程序,以找到最好的出路。在搜索时,它会将下一步移动添加到数组中。我的问题是它一遍又一遍地重复相同的三个动作。我需要找到检查移动数组的最佳方法,以便在检测到循环时强制它改变移动。

为了清晰起见,编辑 http://www.logicmazes.com/theseus.html迷宫三是我正在测试的那个。会发生什么事情,它会在它开始的列中上下移动。

3 个答案:

答案 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)

听起来问题是你的“状态”实际上并没有包含足够的状态信息。在每个周期中,在忒修斯移动并且牛头怪已经移动两次之后,该州包含以下内容:

  • Theseus的x坐标。
  • Theseus的y坐标。
  • 牛头怪的x坐标。
  • 牛头怪的y坐标。

您可以将这些表示为某种MazeState对象,equalshashCode方法可以让您轻松查看两个实例是否代表相同的状态。

由于Minotaur的动作遵循一个非常严格的程序,因此Theseus所做的每一个动作(左/右/上/下/延迟)将从一个明确定义的状态移动到另一个明确定义的状态。然后你需要禁止Theseus做出任何动作:

  • 会导致Minotaur的x和y坐标等于Theseus的坐标(因为这意味着Theseus死了)。
  • 会导致新状态等于您之前所处的状态(因为这意味着没有取得任何进展)。

为此,您可以将先前的状态存储在HashSet<MazeState>