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.java,Board.java AND Vehicle.java
答案 0 :(得分:1)
您的问题看起来有两个方面:
解决方案之一:在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语句中将节点添加到队列中。