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)

#include <iostream>
#include <algorithm> 
#include <queue>
using namespace std;
const int INF = 100;
bool memo[8][8][8][8][8][8][8][8]={};
class SP{
	public:
		int p[2][4];
		int n;
		SP(){
			n=0;
			/*for(int i=0;i<2;i++){
				for(int j=0;j<4;j++){
					p[i][j]= INF;
				}
			}*/
		}
		bool seven_puzzle(){
			return p[0][0]==0 && p[0][1]==1 && p[0][2]==2 && p[0][3]==3
			    && p[1][0]==4 && p[1][1]==5 && p[1][2]==6 && p[1][3]==7;
		}
		bool check(int i,int k){
			if(i==1 && memo[k][0][0][0][0][0][0][0]==false){
				memo[k][0][0][0][0][0][0][0] = true;
				return true;
			}
			if(i==2 && memo[0][k][0][0][0][0][0][0]==false){
				memo[0][k][0][0][0][0][0][0] = true;
				return true;
			}
			if(i==3 && memo[0][0][k][0][0][0][0][0]==false){
				memo[0][0][k][0][0][0][0][0] = true;
				return true;
			}
			if(i==4 && memo[0][0][0][k][0][0][0][0]==false){
				memo[0][0][0][k][0][0][0][0] = true;
				return true;
			}
			if(i==5 && memo[0][0][0][0][k][0][0][0]==false){
				memo[0][0][0][0][k][0][0][0] = true;
				return true;
			}
			if(i==6 && memo[0][0][0][0][0][k][0][0]==false){
				memo[0][0][0][0][0][k][0][0] = true;
				return true;
			}
			if(i==7 && memo[0][0][0][0][0][0][k][0]==false){
				memo[0][0][0][0][0][0][k][0] = true;
				return true;
			}
		}
			
		void rot1(){
			if(check(1,p[0][0])){
				swap(p[0][0],p[0][1]);
				n++;
				memo[p[0][0]][0][0][0][0][0][0][0] = true;
			}
		}
		void rot2(){
			if(check(2,p[0][1])){
				swap(p[0][1],p[0][2]);
				n++;
				memo[0][p[0][1]][0][0][0][0][0][0] = true;
			}
		}
		void rot3(){
			if(check(3,p[0][2])){
				swap(p[0][2],p[0][3]);
				n++;
				memo[0][0][p[0][2]][0][0][0][0][0] = true;
			}
		}
		void rot4(){
			if(check(4,p[0][0])){
				swap(p[0][0],p[1][0]);
				n++;
				memo[0][0][0][p[0][0]][0][0][0][0] = true;
			}
		}
		void rot5(){
			if(check(5,p[0][1])){
				swap(p[0][1],p[1][1]);
				n++;
				memo[0][0][0][0][p[0][1]][0][0][0] = true;
			}
		}
		void rot6(){
			if(check(6,p[0][2])){
				swap(p[0][2],p[1][2]);
				n++;
				memo[0][0][0][0][0][p[0][2]][0][0] = true;
			}
		}
		void rot7(){
			if(check(7,p[0][3])){
				swap(p[0][3],p[1][3]);
				n++;
				memo[0][0][0][0][0][0][p[0][3]][0] = true;
			}
		}
};
int main(){
	//while(true){
		SP sp;
		for(int i=0;i<2;i++){
			for(int j=0;j<4;j++){
				cin >> sp.p[i][j];
			}
		}
		queue<SP> que;
		que.push(sp);
		while(!que.empty()){
			sp = que.front();
			que.pop();
			if (sp.seven_puzzle()){
				cout << sp.n << endl;
				break;
			}
			SP sp1 = sp;
			sp1.rot1();
			que.push(sp1);
	
			SP sp2 = sp;
			sp2.rot2();
			que.push(sp2);

			SP sp3 = sp;
			sp3.rot3();
			que.push(sp3);
		
			SP sp4 = sp;
			sp4.rot4();
			que.push(sp4);
			
			SP sp5 = sp;
			sp5.rot5();
			que.push(sp5);

			SP sp6 = sp;
			sp6.rot6();
			que.push(sp6);
		
			SP sp7 = sp;
			sp7.rot7();
			que.push(sp7);
		}
	//}
	return 0;
}