私は有名な 8 パズルを解こうとしています。3*3 の正方形に 1 つの空きスロットと 8 つの数字が埋められており、解けば元の状態に戻ります。
これを行うには、パズルを表す0〜9の数字を格納するarraylistの「状態」があります。
解決策には、多数の可能な移動状態を生成することが含まれます。つまり、行われたすべての合法的な移動とその結果のパズルを保存します。これは以下のメソッドを使用して行われますが、swapAndStore はパスごとに元の渡された配列を編集しません。代わりに、その下の genSuccessors() で呼び出されると、最初の if 条件で正常に機能し、最初の if の結果に次の if 条件を適用します。「oldBoard」という新しいパズル状態を作成して、元の入力パズルを将来の参照用に保存することで問題を解決したと思いましたが、これも機能しませんでした。友人は、これは私がよく理解できない参照の問題に関係している可能性があると私に言いました。x = 0、y = 1の場合、Javaはswap(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);
}