广度优先搜索(高峰时间) - 链接列表队列包含同一块板的重复

时间:2014-02-02 22:59:40

标签: java breadth-first-search

Hello stackoverflow用户, 我试图在经典的高峰时段游戏中实现广度优先搜索。但是,我遇到了队列问题。在我向队列添加内容之前,我打印出每个板的外观:

[-, 0, 0, -, -, 1]
[2, -, -, 4, -, 1]
[2, 3, 3, 4, -, 1]
[2, -, -, 4, -, -]
[5, -, -, -, 6, 6]
[5, -, 7, 7, 7, -]

0 1 0
[-, -, 0, 0, -, 1]
[2, -, -, 4, -, 1]
[2, 3, 3, 4, -, 1]
[2, -, -, 4, -, -]
[5, -, -, -, 6, 6]
[5, -, 7, 7, 7, -]

0 2 0
[-, -, -, 0, 0, 1]
[2, -, -, 4, -, 1]
[2, 3, 3, 4, -, 1]
[2, -, -, 4, -, -]
[5, -, -, -, 6, 6]
[5, -, 7, 7, 7, -]

但是,当我打印出队列时,它会出现如下:

[-, -, 0, 0, -, 1]
[2, -, -, 4, -, 1]
[2, 3, 3, 4, -, 1]
[2, -, -, 4, -, -]
[5, -, -, -, 6, 6]
[5, -, 7, 7, 7, -]

[-, -, -, 0, 0, 1]
[2, -, -, 4, -, 1]
[2, 3, 3, 4, -, 1]
[2, -, -, 4, -, -]
[5, -, -, -, 6, 6]
[5, -, 7, 7, 7, -]

[-, -, -, 0, 0, 1]
[2, -, -, 4, -, 1]
[2, 3, 3, 4, -, 1]
[2, -, -, 4, -, -]
[5, -, -, -, 6, 6]
[5, -, 7, 7, 7, -]

我打印出这些电路板的代码段:

for (int i = car.getY() + 1; i < (5 - car.getLen()) + 1; i++) {
    if (isSafeHorizontal(b, car, i)) {
        Board copy = new Board(b.boardVehicles, b.moves, nextCar);
        copy.moveVehicle(car.getX(), i, b.currentCar);
        for (int a = 0;  a< queue.size(); a++) {
            System.out.println(queue.get(a));
        }

        //System.out.println(copy);System.out.println("" + car.getX() + " " + i + " " + b.currentCar);
        queue.add(copy);
    }
}

我认为引用可能存在问题,但我无法提出任何不应该工作的原因。

编辑: 这是我的整个代码供参考: BreadthFirstSearch.javaBoard.java AND Vehicle.java

1 个答案:

答案 0 :(得分:1)

您的问题看起来有两个方面:

  1. 第二次打印列表时,您缺少第一个节点(或板)。
  2. 您正在打印第三个项目。
  3. 解决方案之一:在pastebin的BreadthFirstSearch类的第94行看到:

    System.out.println(firstNode);
                LinkedList<Board> queue = new LinkedList<Board>();
                queue.addFirst(firstNode);
                Board solved = null;
                while (queue.size() != 0) {
                        Board b = queue.get(0);
    
                        System.out.println("!===========\ns: " + queue.size() + "\n");
                        //for (int i = 0; i < queue.size(); i++){System.out.println(queue.get(i));}
                        queue.remove(0);
    

    您正在检索第一个项目,然后将其删除。所以你错过了第一个项目。我认为您没有任何理由要删除该节点。

    问题2的解决方案:

    看起来您在第110行和第133行之间的if语句中添加了两次具有相同信息的节点:

     if (car.getDir().equals("V")) {
         // go through every position before the current car's X
         for (int i = 0; ((i < car.getX()) && (i < (5 - car.getLen()) + 1)); i++) {
             // no car in current position? create new vehicle
             // instance
             if (isSafeVertical(b, car, i)) {
                 Board copy = new Board(b.boardVehicles, b.moves, nextCar);
                 copy.moveVehicle(i, car.getY(), b.currentCar);
                 queue.add(copy);
             }
         }
         // go through every position after current car's x
         for (int i = car.getX() + 1; i < (5 - car.getLen()) + 1; i++) {
             // no car in current pos? create new vehicle instance.
                 if (isSafeVertical(b, car, i)) {
                     Board copy = new Board(b.boardVehicles, b.moves, nextCar);
                     copy.moveVehicle(i, car.getY(), b.currentCar);
                     queue.add(copy);
                 }
         }
         // move horizontal cars and add to queue
    

    了解如何在那里添加节点,并查看如何在打印出节点的for语句中将节点添加到队列中。