我知道标题听起来有点奇怪,但让我试着解释一下。
我编写了一个小型状态机,我试图将盲搜索实现到最终状态(由用户决定)。到目前为止,我已经能够为编号为2x2的网格生成所有可能的状态。每个州都由此定义:
static List<State> states = new ArrayList<State>();
public class State {
int info[][][]; //Información del éstado (Número almacenado en x, y, z posición)
HashMap<String, State> vecinos = new HashMap<String, State>(); //Lista de vecinos e instrucción para llegar a ellos desde el estado actual
boolean valido; //Bit de validez
boolean visitado; //Bit de visitado
public State() {
this.info = info;
this.valido = true;
this.visitado = false;
}
public boolean equals(State s) {
boolean iguales = true;
for (int i = 0; i < face; i++) {
for (int j = 0; j < rows; j++) {
for (int k = 0; k < cols; k++) {
if (this.info[i][j][k] != s.info[i][j][k])
iguales = false;
}
}
}
return iguales;
}
public String toString() {
String ret = new String(" ");
for (int i = 0; i < face; i++) {
for (int j = 0; j < rows; j++) {
ret = ret + "\n";
for (int k = 0; k < cols; k++) {
ret = ret + " " + info[i][j][k] + " ";
}
}
}
return ret;
}
}
现在,正如您所看到的,我在每个州内都有一个HashMap。这个HashMap是我应该用于盲目搜索的那个,但这是我的问题:
public State genSt(State estado, instrucciones inst) {
State nxtSt = estado;
int[][][] toswap = new int[face][rows][cols];
int[] place0 = new int[3];
switch (inst) {
case arriba:
boolean val = checkvalidity(estado, inst);
if (val) {
place0 = find0(estado);
toswap = estado.info;
int swap = estado.info[place0[0]][place0[1] + 1][place0[2]];
toswap[place0[0]][place0[1]][place0[2]] = swap;
toswap[place0[0]][place0[1] + 1][place0[2]] = 0;
nxtSt.info=toswap;
nxtSt = repeated(nxtSt);
if (nxtSt != null) {
estado.vecinos.put("arriba", nxtSt);
nxtSt.vecinos.put("abajo", estado);
nxtSt.valido = true;
System.out.print("\n ARRIBA \n _________ \n" + nxtSt.toString());
} else
System.out.print("\nREPEATED ARRIBA\n");
} else return null;
break;
...
default:
System.out.print("Instrucción inválida");
}
//estado = nxtSt;
return nxtSt; //Regresa estado generado
}
但是当我更改nxtSt的值时,它也会更改estado的值,并且列表中的其余元素也会更改。所以每个人都有相同的hashmap,我无法进行搜索。
你知道我该如何解决这个问题吗?提前谢谢。
编辑:我试图为信息实现手动深层复制,但我认为我在更多行中也做了同样的事情,因为它不起作用。这是代码:
public int[][][] genNxSt(State original){
curInfo = new int[face][rows][cols];
for(int f =0; f<face;f++){
for(int r=0; r<rows; r++){
for(int c=0; c<cols; c++){
curInfo[f][r][c] = original.info[f][r][c];
}
}
}
return curInfo;
}