我正在尝试解决著名的 8-puzzle,其中一个 3*3 的正方形充满了 1 个空槽和 8 个数字,解决方法是将其恢复到原始状态。
为此,我有一个 arraylist 的“状态”,它存储数字 0~9,代表谜题。
解决方案涉及产生大量可能的移动状态,这意味着我保存了每一个合法的移动以及由此产生的谜题。这是使用下面的方法完成的,但我的 swapAndStore 不会每次都编辑原始传递的数组。相反,当在下面的 genSuccessors() 中调用时,它会在第一个 if 条件下正常工作,然后在第一个 if 的结果上应用下一个 if 条件。我想我通过制作一个名为“oldBoard”的新拼图状态来解决这个问题,以保存原始输入拼图以供将来参考,但这也不起作用。一位朋友告诉我,这可能与参考问题有关,我不能很好地掌握。我知道当 x=0,y=1 时,java 不会进行交换(x,y),因此 x = 1,y=0,但看不到这在这里是如何应用的。建议?
private void swapAndStore(int d1, int d2, ArrayList<State> s)
{
//int[] cpy = copyBoard(curBoard);
int[] cpy = new int [curBoard.length];
System.arraycopy(curBoard,0,cpy,0,curBoard.length);
int[] oldBoard = new int [curBoard.length];
System.arraycopy(curBoard,0,oldBoard,0,curBoard.length);
int temp = cpy[d1];
cpy[d1] = cpy[d2];
cpy[d2] = temp;
s.add((new State(cpy)));
curBoard = oldBoard;
System.out.println("swapandstore storing" );
s.get(s.size()-1).printState();
}
public ArrayList<State> genSuccessors()
{
ArrayList<State> successors = new ArrayList<State>();
int hole = getHole();
// try to generate a state by sliding a tile leftwise into the hole
// if we CAN slide into the hole
if (hole != 0 && hole != 3 && hole != 6)
{
/*
* we can slide leftwise into the hole, so generate a new state for
* this condition and throw it into successors
*/;
System.out.println("left");
swapAndStore(hole - 1, hole, successors);
}
// try to generate a state by sliding a tile topwise into the hole
if (hole != 6 && hole != 7 && hole != 8)
{
System.out.println("top");
swapAndStore(hole + 3, hole, successors);
}