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: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.HashMap;
 
public class Main {
	private	static			BufferedReader	br  = null;
	private	static	final	String			INI = "01234567";
	private	static	final	int[]			SV = { 1, -1, 0, 0  };
	private	static	final	int[]			SH = { 0, 0,  1, -1 };

	static {
		br = new BufferedReader(new InputStreamReader(System.in));
	}
 
    /**
     * @param args
     */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StepTbl	stp = new StepTbl();
		String	arr = null;

		swap(stp);

		while ((arr = parseArray()) != null) {
			System.out.println(stp.get(arr));
		}
	}

	private static void swap(StepTbl tbl) {
		// 0 1 2 3
		// 4 5 6 7
		Queue	que = new Queue();
		Stat	fst = new Stat();
		int		cnt = 0;

		tbl.put(INI, cnt);
		fst.stt = INI;
		fst.stp = 0;
		que.add(fst);

		while (que.size() > 0) {
			Stat	cst = que.pollFirst();
			int		cp  = cst.stt.indexOf("0");
			int		cy = cp / 4;
			int		cx = cp % 4;

			for (int l = 0; l < 4; l++) {
				int		ny = cy + SV[l];
				int		nx = cx + SH[l];

				if (0 <= nx && nx < 4 && 0 <= ny && ny < 2) {
					boolean	fin = false;
					Stat	nst = new Stat();
					char[]	na  = cst.stt.toCharArray();
					char	sc  = na[ny*4+nx];

					na[ny*4+nx] = na[cy*4+cx];
					na[cy*4+cx] = sc;

					nst.stt = String.valueOf(na);
					nst.stp = cst.stp+1;

					if (tbl.containsKey(nst.stt)) {
						if (nst.stp >= tbl.get(nst.stt)) {
							fin = true;
						}
					}

					if (!fin) {
						tbl.put(nst.stt, nst.stp);
						que.add(nst);
					}
				}			
			}
		}
	}

	private static String parseArray() {
		String  arr = null;

		if ((arr = parseStdin()) != null) {
			arr = arr.replaceAll(" ", "");
		}

		return arr;
	}

	private static String parseStdin() {
		String  stdin = null;

		try {
			String  tmp = br.readLine();
			if (tmp != null) {
				if (!tmp.isEmpty()) stdin = tmp;
			}
		}
		catch (IOException e) {}

		return stdin;
	}
}

class Stat {
	String	stt = null;
	Integer	stp = 0;
}

class Queue extends ArrayDeque<Stat> {
}

class StepTbl extends HashMap<String, Integer> {
}