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<iostream>
#include<queue>
#include<vector>

using namespace std;

bool checker[8][8][8][8][8][8][8];

class Puzzle{

public:
  short p[2][4];
  short lastorder;//1 ???  3?????? 5 ??????
  short ordernum;

  Puzzle(){
    /*p = new short*[2];
    for(int i=0; i<2; i++){
      p[i] = new short[4];
    }*/
    this->lastorder = 8;
    this->ordernum = 0;
  }

  /*Puzzle(const Puzzle& puzzle){
    p = new short*[2];
    for(int i=0; i<2; i++){
      p[i] = new short[4];
    }
    for(int i=0;i<2;i++){
      for(int j=0;j<4;j++){
        p[i][j] = puzzle.p[i][j];
      }
    }
    this->lastorder = puzzle.lastorder;
    this->ordernum = puzzle.ordernum;
  }*/

  ~Puzzle(){
    /*for(int i=0; i<2; i++){
      delete[] p[i];
    }
    delete[] p;*/
  }

  /*inline bool check(){
    return(checker[p[0][0]][p[0][1]][p[0][2]][p[0][3]][p[1][0]][p[1][1]][p[1][2]]);
  }

  inline void throughpuzzle(){
    checker[p[0][0]][p[0][1]][p[0][2]][p[0][3]][p[1][0]][p[1][1]][p[1][2]] = false;
  }*/

};




int main(){



  while(1){

    for(int a=0;a<8;a++){
      for(int b=0;b<8;b++){
        for(int c=0;c<8;c++){
          for(int d=0;d<8;d++){
            for(int e=0;e<8;e++){
              for(int f=0;f<8;f++){
                for(int g=0;g<8;g++){
                  checker[a][b][c][d][e][f][g] = true;
                }
              }
            }
          }
        }
      }
    }

    queue<Puzzle> q;

    Puzzle Start;

    cin >> Start.p[0][0];

    if(cin.eof()){
      break;
    }

    cin >> Start.p[0][1] >> Start.p[0][2] >> Start.p[0][3] >> Start.p[1][0] >> Start.p[1][1] >> Start.p[1][2] >> Start.p[1][3];

    q.push(Start);

    while(!q.empty()){

      Puzzle tmp;
      tmp = q.front();
      q.pop();


      if(tmp.p[0][0] == 0 && tmp.p[0][1] == 1 && tmp.p[0][2] == 2 && tmp.p[0][3] == 3 && tmp.p[1][0] == 4 && tmp.p[1][1] == 5 && tmp.p[1][2] == 6){
          cout << tmp.ordernum << endl;
          while(!q.empty()){
            tmp = q.front();
            q.pop();
          }
          break;
      }

      short x,y;

      for(short i=0;i < 2; i++){
        for(short j=0;j < 4; j++){
          if(tmp.p[i][j] == 0){
            x = j;
            y = i;
            i=500;
          }
        }
      }

      tmp.ordernum++;

      short Beforeorder = tmp.lastorder;

      Puzzle puzzle = tmp;
      short t;

      if(x != 3 && Beforeorder != 3){
        t  = puzzle.p[y][x];
        puzzle.p[y][x] = puzzle.p[y][x+1];
        puzzle.p[y][x+1] = t;

        if((checker[puzzle.p[0][0]][puzzle.p[0][1]][puzzle.p[0][2]][puzzle.p[0][3]][puzzle.p[1][0]][puzzle.p[1][1]][puzzle.p[1][2]])){
          puzzle.lastorder = 1;
          q.push(puzzle);
          checker[puzzle.p[0][0]][puzzle.p[0][1]][puzzle.p[0][2]][puzzle.p[0][3]][puzzle.p[1][0]][puzzle.p[1][1]][puzzle.p[1][2]] = false;
        }
        puzzle = tmp;
      }

      if(x != 0 && Beforeorder != 1){
        t  = puzzle.p[y][x];
        puzzle.p[y][x] = puzzle.p[y][x-1];
        puzzle.p[y][x-1] = t;
        if((checker[puzzle.p[0][0]][puzzle.p[0][1]][puzzle.p[0][2]][puzzle.p[0][3]][puzzle.p[1][0]][puzzle.p[1][1]][puzzle.p[1][2]])){
          puzzle.lastorder = 3;
          q.push(puzzle);
          checker[puzzle.p[0][0]][puzzle.p[0][1]][puzzle.p[0][2]][puzzle.p[0][3]][puzzle.p[1][0]][puzzle.p[1][1]][puzzle.p[1][2]] = false;
        }
        puzzle = tmp;
      }

      if(Beforeorder !=  5){
        t  = puzzle.p[0][x];
        puzzle.p[0][x] = puzzle.p[1][x];
        puzzle.p[1][x] = t;
        if((checker[puzzle.p[0][0]][puzzle.p[0][1]][puzzle.p[0][2]][puzzle.p[0][3]][puzzle.p[1][0]][puzzle.p[1][1]][puzzle.p[1][2]])){
          puzzle.lastorder = 5;
          checker[puzzle.p[0][0]][puzzle.p[0][1]][puzzle.p[0][2]][puzzle.p[0][3]][puzzle.p[1][0]][puzzle.p[1][1]][puzzle.p[1][2]] = false;
          q.push(puzzle);
        }
      }

    }

  }


    return 0;
}