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: Time Limit Exceeded)

import java.util.*;

import java.lang.*;

import java.math.*;



public class Main {

	Scanner sc = new Scanner(System.in);



	LinkedList<String> getAdj(String puzzle) {

		LinkedList<String> a = new LinkedList<String>();

		int index = puzzle.indexOf('0');

		int[] adj = { -1, 1, -4, 4 };

		for (int i = 0; i < 4; i++) {

			int ni = index + adj[i];

			if (ni < 0)

				continue;

			if (ni > 7)

				continue;

			if(index == 5 && ni == 4)

				continue;

			if(index == 4 && ni == 5)

				continue;

			char buffer = puzzle.charAt(ni);

			String str = puzzle.replace('0', '_');

			str = str.replace(buffer, '0');

			str = str.replace('_', buffer);

			a.add(str);

		}

		return a;

	}



	void run() {

		LinkedList<String> memo = new LinkedList<String>();

		memo.add("01234567");

		HashMap<String, Integer> map = new HashMap<String, Integer>();

		map.put("01234567",0);

		int step = 1;

		for (; !memo.isEmpty();) {

//			if(step>3)break;

			LinkedList<String> nextMemo = new LinkedList<String>();

			

			for (String str : memo) {

//				System.out.println(str);

				for (String adj : getAdj(str)) {

//					System.out.println(" "+adj);

					if (nextMemo.contains(adj)) {

						continue;

					}

					if (map.containsKey(adj)) {

						continue;

					}

					map.put(adj,step);

					nextMemo.add(adj);

				}

			}

			step++;

			memo = nextMemo;

		}





		for (; sc.hasNextLine();) {

			System.out.println(map.get(sc.nextLine().replace(" ", "")));

		}

	}



	public static void main(String[] args) {

		Main m = new Main();

		m.run();

	}

}