Problem:
7 パズル

7 パズルは 8 つの正方形のカードとこれらのカードがぴたりと収まる枠で構成されています。それぞれのカードには、互いに区別できるように 0, 1, 2, ..., 7 と番号がつけられています。枠には、縦に 2 個、横に 4 個のカードを並べることができます。

7 パズルを始めるときには、まず枠にすべてのカードを入れます。枠のなかで 0 のカードだけは、上下左右に隣接するカードと位置を交換することができます。たとえば、枠の状態が図(a) のときに、0 のカードの右に隣接した、7 のカードと位置を交換すれば、図(b) の状態になります。あるいは、図(a) の状態から 0 のカードの下に隣接した 2 のカードと位置を交換すれば図(c) の状態になります。図(a) の状態で 0 のカードと上下左右に隣接するカードは 7 と 2 のカードだけなので、これ以外の位置の入れ替えは許されません。

ゲームの目的は、カードをきれいに整列して図(d) の状態にすることです。最初の状態を入力とし、カードをきれいに整列するまでに、必要な最小手数を出力するプログラムを作成してください。ただし、入力されたカードの状態からは図(d) の状態に移ることは可能であるとします。

入力データは、1 行に 8 つの数字が空白区切りで与えられます。これらは、最初の状態のカードの並びを表します。例えば、図(a) の数字表現は0 7 3 4 2 5 1 6 に、図(c) は 2 7 3 4 0 5 1 6 となります。

図(a) 0 7 3 4 2 5 1 6 の場合

図(b) 7 0 3 4 2 5 1 6 の場合

図(c) 2 7 3 4 0 5 1 6 の場合

図(d) 0 1 2 3 4 5 6 7 (最終状態)

Input

上記形式で複数のパズルが与えられます。入力の最後まで処理してください。
与えられるパズルの数は 1,000 以下です。

Output

各パズルについて、最終状態へ移行する最小手数を１行に出力してください。

Sample Input

0 1 2 3 4 5 6 7
1 0 2 3 4 5 6 7
7 6 5 4 3 2 1 0

Output for the Sample Input

0
1
28

Solution in JAVA (judge verdict: Memory Limit Exceeded)


import java.util.*;
class Main {

    public static int kaijo(int n)
    {
        int result = 1;
        for(int i = 1 ; i<=n; i++)
        {
            result*=i;
        }
        return result;
    }
    public static int Array2id(int[] array)
    {
        //??????????????????
        int temp[] = new int[8];
        for(int i=0; i<8; i++)
        {
            temp[i]=array[i];
        }
        int result = 0;
        for(int i=0; i<7; i++)
        {
            result+=temp[i]*kaijo(7-i);
            for(int j=i+1; j<8; j++)
            {
                if(temp[i]<temp[j])
                {
                    temp[j]--;
                }
            }
        }
        return result;
    }
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
            int done[] = new int[kaijo(9)];
            int array[][] = new int[kaijo(9)][8];
            for (int i = 0; i < kaijo(9); i++) {
                done[i] = 0;
            }
            //????±?
            int n = 0;
            //????????°
            int num = 1;
            //????????????????????????
            int start = 0;
            for (int i = 0; i < 8; i++) {
                array[0][i] = sc.nextInt();
            }
            while (true) {
                n++;
                int ntemp = num;
                for (int i = start; i < num; i++) {

                    //?????¨??????????????°???????????????????????????
                    done[Array2id(array[i])] = -1;
                    //0??????????????¢?´¢
                    int zpos = -1;
                    for (int j = 0; j < 8; j++) {
                        if (array[i][j] == 0) {
                            zpos = j;
                            break;
                        }
                    }
                    //???????????¢

                    int tarray[] = new int[8];
                    for (int j = 0; j < 8; j++) {
                        tarray[j] = array[i][j];
                    }
                    tarray[zpos] = tarray[(zpos + 4) % 8];
                    tarray[(zpos + 4) % 8] = 0;
                    if (done[Array2id(tarray)] != -1) {
                        ntemp++;
                        array[ntemp] = tarray;
                    }


                    //???????§????
                    if (zpos % 4 != 3) {
                        int temparray[] = new int[8];
                        for (int j = 0; j < 8; j++) {
                            temparray[j] = array[i][j];
                        }
                        temparray[zpos] = temparray[zpos + 1];
                        temparray[zpos + 1] = 0;
                        if (done[Array2id(temparray)] != -1) {
                            ntemp++;
                            array[ntemp] = temparray;
                        }
                    }
                    //???????§????
                    if (zpos % 4 != 0) {
                        int temparray[] = new int[8];
                        for (int j = 0; j < 8; j++) {
                            temparray[j] = array[i][j];
                        }
                        temparray[zpos] = temparray[zpos - 1];
                        temparray[zpos - 1] = 0;
                        if (done[Array2id(temparray)] != -1) {
                            ntemp++;
                            array[ntemp] = temparray;
                        }
                    }
                }
                start = num + 1;
                num = ntemp + 1;
                if (done[0] == -1) {
                    break;
                }
            }
            System.out.println(n - 1);
        }
    }
}