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

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i = a;i<n;i++)

int tenPow(int num){
  int ans =1;
  rep(i,0,num){
    ans*=10;
  }
  return ans;
}
int main(){
  while(true){
    map<int,int> Puzzle;
    Puzzle[1234567]=-1;
    int p=0;
    int cnum;
    string c;
    rep(i,0,8){
      cin >>c;
      if(cin.eof())break;
      stringstream ss;
      ss << c;
      ss >> cnum;
      rep(j,0,7-i){
        cnum*=10;
      }
      p+=cnum;
    }

    int pa = p;
    queue<int> q;
    q.push(pa);
    int BFSnum=1;
    int nowpos=0;
    while(!q.empty()){
      if(BFSnum==0){
        BFSnum=q.size();
        nowpos++;
      }
      BFSnum--;
      int num=q.front();
      q.pop();
      if(Puzzle[num]==1)continue;
      if(Puzzle[num]==-1){
        cout <<nowpos<<endl;
        break;
      }
      Puzzle[num]=1;
      int zeropos;
      int tmp=num;
      for(int i = 0;true;i++){
        if(tmp%10==0){
          zeropos=i;
          break;
        }
        tmp/=10;
      }
      tmp = num;
      if(!(zeropos==7 || zeropos==3)){
        int swapnum=(tmp/tenPow(zeropos+1))%10;
        swapnum =tmp - swapnum*tenPow(zeropos+1)+swapnum*tenPow(zeropos);
        int pushnum;
        pushnum=swapnum;
        q.push(pushnum);
      }
      if(!(zeropos==4 || zeropos==0)){
        int swapnum=(tmp/tenPow(zeropos-1))%10;
        swapnum =tmp - swapnum*tenPow(zeropos-1)+swapnum*tenPow(zeropos);
        int pushnum;
        pushnum=swapnum;
        q.push(pushnum);
      }
      if(zeropos>=4){
        int swapnum=(tmp/tenPow(zeropos-4))%10;
        swapnum =tmp - swapnum*tenPow(zeropos-4)+swapnum*tenPow(zeropos);
        int pushnum;
        pushnum=swapnum;
        q.push(pushnum);
      }
      if(zeropos<=3){
        int swapnum=(tmp/tenPow(zeropos+4))%10;
        swapnum =tmp - swapnum*tenPow(zeropos+4)+swapnum*tenPow(zeropos);
        int pushnum;
        pushnum=swapnum;
        q.push(pushnum);
      }
    }
  }
  return 0;
}