我正在尝试用Java编写一个3x3方移拼图解算器。但是,我被困在我移动块的部分 - 我一直在用我正在使用的算法结束一堆新的空白空间。经过一些测试后,我确定这是因为,尽管我使用了clone()命令,但当我更改“current”时,v的数组仍然受到影响。有谁知道这是为什么以及如何解决它?我认为在使用clone之后,我可以更改新数组而不会影响旧数组。
if (!rightwall)
{
int[][] current = v.state.clone();
current[x][y] = current[x][y + 1];
current[x][y + 1] = 0;
State w = new State(current);
w.distance = v.distance + 1;
w.path = v;
System.out.println("Right Shift:");
w.print();
q.insert(w);
}
State是一个表示二维数组的类以及一些属性 - State的代码的第一部分是
public class State {
int[][] state = new int[3][3];
int distance = 0;
boolean known = false;
State path = null;
State(int[][] newstate){
state = newstate.clone();
}
v是表示当前位置的状态。然后,w将是在将空白空间与其旁边的空间切换之后创建的“相邻”位置。
q是一个队列。
答案 0 :(得分:8)
在State类中,您需要确保深度复制所有属性。