我在生成用于实现爬山算法的邻居时遇到问题。
这是我目前正在使用的代码。
public ArrayList<Board> generateNeighbors(){
ArrayList<Board> neighborBoards = new ArrayList<Board>();
HashMap<Integer, Integer> initialQueenLocations = this.queenLocations;
for(int i = 0; i < queen; i++){
int[][] neighborBoard = new int[queen][queen];
HashMap<Integer, Integer> neighborQueenLocations = initialQueenLocations;
for(int k = i; k < queen; k++){
for(int j = 0; j < queen; j++){
neighborBoard[j][initialQueenLocations.get(j)] = 1;
}
int initialLocation = initialQueenLocations.get(k);
if(initialLocation > 0){
neighborBoard[k][initialLocation] = 0;
neighborBoard[k][initialLocation - 1] = 1;
neighborQueenLocations.put(k, initialLocation - 1);
neighborBoards.add(new Board(neighborBoard, neighborQueenLocations));
break;
}
}
}
}
我遇到的问题是,我生成的每个新板都会保存最后一步,我希望每个相邻板都有一个步长。以下是(错误的)输出:
//initial
0|0|1|
0|1|0|
0|1|0|
//step 1
0|1|0|
0|1|0|
0|1|0|
//step 2
0|1|0|
1|0|0|
0|1|0|
//step 3
0|1|0|
1|0|0|
1|0|0|
这是我想要的输出。
//initial
0|0|1|
0|1|0|
0|1|0|
//step 1
0|1|0|
0|1|0|
0|1|0|
//step 2
0|0|1|
1|0|0|
0|1|0|
//step 3
0|0|1|
0|1|0|
1|0|0|
如您所见,它正在保存上一步的移动。有人能帮忙吗?
最佳答案
你的问题是你覆盖了你的初始值。在将HashMap
设置为neighborQueenLocations
的地方,基本上只需设置对initialQueenLocations
哈希映射的引用。因此,当您执行initialQueenLocations
操作时,您将写入由neighborQueenLocations.put(k, initialLocation - 1);
保留的内存,但通过initialQueenLocations
变量“访问”它。
...
for(int i = 0; i < queen; i++){
int[][] neighborBoard = new int[queen][queen];
// Here you are setting a reference, not copying the values
HashMap<Integer, Integer> neighborQueenLocations = initialQueenLocations;
...
在后面的代码中,您将覆盖
neighborQueenLocations
hashmap中的值,因为initialQueenLocations
只是对neighborQueenLocations
的引用。 ...
neighborBoard[k][initialLocation] = 0;
neighborBoard[k][initialLocation - 1] = 1;
neighborQueenLocations.put(k, initialLocation - 1);
...
这就是为什么它“记得”最后一步。