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.*;
import static java.lang.System.*;

public class Main {

	Scanner sc = new Scanner(in);
	
	String swap(String s, int x, int y) {
		if (x > y) {
			int t = x;
			x = y; 
			y = t;
		}
		if (x < 0 || y >= 8 || (x == 3 && y == 4)) return null;
		String res = "";
		for (int i = 0; i < 8; i++) {
			if (i == x)
				res += s.charAt(y);
			else if (i == y)
				res += s.charAt(x);
			else
				res += s.charAt(i);
		}
		return res;
	}
	
	String[] change(String s) {
		int n = 0;
		for (int i = 0; i < 8; i++) {
			if (s.charAt(i) == '0') {
				n = i;
				break;
			}
		}
		String[] res = new String[3];
		res[0] = swap(s, n, (1-n/4)*4+n%4);
		res[1] = swap(s, n, n+1);
		res[2] = swap(s, n, n-1);
		return res;
	}
	
	void run() {
		while (sc.hasNext()) {
			Map<String, Integer> map = new HashMap<String, Integer>();
			String s = "";
			for (int i = 0; i < 8; i++)
				s += String.valueOf(sc.nextInt());
			map.put(s, 0);
			Queue<String> queue = new LinkedList<String>();
			queue.add(s);
			while (!queue.isEmpty() && !map.containsKey("01234567")) {
				String st = queue.poll();
				String[] sts = change(st);
				for (int i = 0; i < 3; i++) {
					if (sts[i] != null && !map.containsKey(sts[i])) {
						map.put(sts[i], map.get(st)+1);
						queue.add(sts[i]);
					}
				}
			}
			out.println(map.get("01234567"));
		}
	}
	
	public static void main(String[] args) {
		new Main().run();
	}

}