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 C# (judge verdict: Memory Limit Exceeded)

using System;
using System.Linq;
using System.Collections.Generic;
using System.Linq.Expressions;


class Prog
{
	static List<int[]> paz = new List<int[]>();
	static int Main()
	{
		
		string temp;
		while((temp=Console.ReadLine()) != null)
		{
			paz.Add(temp.Split(' ').Select(int.Parse).ToArray());
		}

		var PazQueue = new Queue<int[]>();
		var StateQueue = new Queue<int[]>();
		int[] nowPaz;
		int[] state = new[] {0,0,0};
		int  defZero;
		foreach(var pazz in paz)
		{
			defZero = pazz.Select((item,index)=>new {Index =index,Value = item}).Where(item => item.Value == 0).Select(item => item.Index).First();
			//最初から完成
			if(Check(pazz)){Console.WriteLine("0");continue;}	
			
			foreach(var p in GetNextNodes(-1,defZero))
			
			{

				PazQueue.Enqueue(pazz);
				StateQueue.Enqueue(new[]{defZero,p,0});
			}

			while(PazQueue.Count != 0 )
			{
				nowPaz = PazQueue.Dequeue();
				state = StateQueue.Dequeue();
			
				/*
				 * foreach(var s in state)
				Console.WriteLine(s);
				foreach(var np in nowPaz)
					Console.WriteLine(np);
					*/
				nowPaz = swap(nowPaz,state);
				state[2]++;
				var nextState = state;
				if(Check(nowPaz))break;
				foreach(var p in GetNextNodes(state[0],state[1]))
				{
					PazQueue.Enqueue(nowPaz);
					nextState[0] = state[1];
					state[1] = p;
					StateQueue.Enqueue(nextState);
				}

			}
			Console.WriteLine(state[2]);
		}

		
		return 0;
	}
	static 	int[] swap(int[] list,int[] points)
	{
		int temp;
		temp = list[points[0]];
		list[points[0]] =list[points[1]];
		list[points[1]] = temp;
		return list;
		
	}
	static bool Check(int[] p)
	{
		for(int i = 0;i<p.Length;i++)
		{
			if(p[i]!=i)return false;
		}
		return true;
	}

	static int[] GetNextNodes(int pre,int now)
	{
		var next = new List<int>();
		if(now == 3)
		{
			next = new List<int>(new[]{2,7});
		}else if(now == 4){
			next = new List<int>(new[]{0,5});
		}else{
			if( (now-1)>=0 && (now-1)<=7)next.Add(now-1);
			if( (now-4)>=0 && (now-4)<=7)next.Add(now-4);
			if( (now+1)>=0 && (now+1)<=7)next.Add(now+1);
			if( (now+4)>=0 && (now+4)<=7)next.Add(now+4);
		}
		next.RemoveAll(x =>x== pre);
		return next.ToArray();
	}
}