Problem p00121 (C++) — buggy submission, verdict: Time Limit Exceeded

// 2013/11/05 Tazoe

#include <iostream>
#include <queue>
using namespace std;

struct state {
  int p[8];
  int t;
};

int main() {
  while (true) {
    int P[8];

    cin >> P[0];

    if (cin.eof())
      break;

    for (int i = 1; i < 8; i++) {
      cin >> P[i];
    }

    if (P[0] == 0 && P[1] == 1 && P[2] == 2 && P[3] == 3 && P[4] == 4 &&
        P[5] == 5 && P[6] == 6 && P[7] == 7) {
      cout << 0 << endl;
      continue;
    }

    struct state s;
    for (int i = 0; i < 8; i++) {
      s.p[i] = P[i];
    }
    s.t = 0;

    queue<struct state> q;
    q.push(s);

    bool memo[8][8][8][8][8][8][8];
    for (int i0 = 0; i0 < 8; i0++) {
      for (int i1 = 0; i1 < 8; i1++) {
        for (int i2 = 0; i2 < 8; i2++) {
          for (int i3 = 0; i3 < 8; i3++) {
            for (int i4 = 0; i4 < 8; i4++) {
              for (int i5 = 0; i5 < 8; i5++) {
                for (int i6 = 0; i6 < 8; i6++) {
                  memo[i0][i1][i2][i3][i4][i5][i6] = false;
                }
              }
            }
          }
        }
      }
    }
    memo[s.p[0]][s.p[1]][s.p[2]][s.p[3]][s.p[4]][s.p[5]][s.p[6]] = true;

    bool flg = true;

    while (true) {
      if (q.empty())
        break;

      struct state t = q.front();
      t.t++;

      for (int i = 0; i < 8; i++) {
        if (t.p[i] == 0) {
          if (0 <= i && i <= 3) {
            t.p[i] = t.p[i + 4];
            t.p[i + 4] = 0;

            if (t.p[0] == 0 && t.p[1] == 1 && t.p[2] == 2 && t.p[3] == 3 &&
                t.p[4] == 4 && t.p[5] == 5 && t.p[6] == 6 && t.p[7] == 7) {
              cout << t.t << endl;
              flg = false;
              break;
            }

            if (!memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]]) {
              q.push(t);
              memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]] =
                  true;
            }

            t.p[i + 4] = t.p[i];
            t.p[i] = 0;
          }

          if (4 <= i && i <= 7) {
            t.p[i] = t.p[i - 4];
            t.p[i - 4] = 0;

            if (t.p[0] == 0 && t.p[1] == 1 && t.p[2] == 2 && t.p[3] == 3 &&
                t.p[4] == 4 && t.p[5] == 5 && t.p[6] == 6 && t.p[7] == 7) {
              cout << t.t << endl;
              flg = false;
              break;
            }

            if (!memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]]) {
              q.push(t);
              memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]] =
                  true;
            }

            t.p[i - 4] = t.p[i];
            t.p[i] = 0;
          }

          if (i != 0 && i != 4) {
            t.p[i] = t.p[i - 1];
            t.p[i - 1] = 0;

            if (t.p[0] == 0 && t.p[1] == 1 && t.p[2] == 2 && t.p[3] == 3 &&
                t.p[4] == 4 && t.p[5] == 5 && t.p[6] == 6 && t.p[7] == 7) {
              cout << t.t << endl;
              flg = false;
              break;
            }

            if (!memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]]) {
              q.push(t);
              memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]] =
                  true;
            }

            t.p[i - 1] = t.p[i];
            t.p[i] = 0;
          }

          if (i != 3 && i != 7) {
            t.p[i] = t.p[i + 1];
            t.p[i + 1] = 0;

            if (t.p[0] == 0 && t.p[1] == 1 && t.p[2] == 2 && t.p[3] == 3 &&
                t.p[4] == 4 && t.p[5] == 5 && t.p[6] == 6 && t.p[7] == 7) {
              cout << t.t << endl;
              flg = false;
              break;
            }

            if (!memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]]) {
              q.push(t);
              memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]] =
                  true;
            }

            t.p[i + 1] = t.p[i];
            t.p[i] = 0;
          }

          break;
        }
      }

      if (!flg)
        break;

      q.pop();
    }
  }

  return 0;
}

Error: TLE

Fixed submission:

// 2013/11/05 Tazoe

#include <iostream>
#include <queue>
using namespace std;

struct state {
  int p[8];
  int t;
};

int main() {
  while (true) {
    int P[8];

    cin >> P[0];

    if (cin.eof())
      break;

    for (int i = 1; i < 8; i++) {
      cin >> P[i];
    }

    if (P[0] == 0 && P[1] == 1 && P[2] == 2 && P[3] == 3 && P[4] == 4 &&
        P[5] == 5 && P[6] == 6 && P[7] == 7) {
      cout << 0 << endl;
      continue;
    }

    struct state s;
    for (int i = 0; i < 8; i++) {
      s.p[i] = P[i];
    }
    s.t = 0;

    queue<struct state> q;
    q.push(s);

    bool memo[8][8][8][8][8][8][8];
    for (int i0 = 0; i0 < 8; i0++) {
      for (int i1 = 0; i1 < 8; i1++) {
        for (int i2 = 0; i2 < 8; i2++) {
          for (int i3 = 0; i3 < 8; i3++) {
            for (int i4 = 0; i4 < 8; i4++) {
              for (int i5 = 0; i5 < 8; i5++) {
                for (int i6 = 0; i6 < 8; i6++) {
                  memo[i0][i1][i2][i3][i4][i5][i6] = false;
                }
              }
            }
          }
        }
      }
    }
    memo[s.p[0]][s.p[1]][s.p[2]][s.p[3]][s.p[4]][s.p[5]][s.p[6]] = true;

    bool flg = true;

    while (true) {
      if (q.empty())
        break;

      s = q.front();

      for (int i = 0; i < 8; i++) {
        if (s.p[i] == 0) {
          struct state t;
          for (int j = 0; j < 8; j++) {
            t.p[j] = s.p[j];
          }
          t.t = s.t + 1;

          if (0 <= i && i <= 3) {
            t.p[i] = t.p[i + 4];
            t.p[i + 4] = 0;

            if (t.p[0] == 0 && t.p[1] == 1 && t.p[2] == 2 && t.p[3] == 3 &&
                t.p[4] == 4 && t.p[5] == 5 && t.p[6] == 6 && t.p[7] == 7) {
              cout << t.t << endl;
              flg = false;
              break;
            }

            if (!memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]]) {
              q.push(t);
              memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]] =
                  true;
            }

            t.p[i + 4] = t.p[i];
            t.p[i] = 0;
          }

          if (4 <= i && i <= 7) {
            t.p[i] = t.p[i - 4];
            t.p[i - 4] = 0;

            if (t.p[0] == 0 && t.p[1] == 1 && t.p[2] == 2 && t.p[3] == 3 &&
                t.p[4] == 4 && t.p[5] == 5 && t.p[6] == 6 && t.p[7] == 7) {
              cout << t.t << endl;
              flg = false;
              break;
            }

            if (!memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]]) {
              q.push(t);
              memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]] =
                  true;
            }

            t.p[i - 4] = t.p[i];
            t.p[i] = 0;
          }

          if (i != 0 && i != 4) {
            t.p[i] = t.p[i - 1];
            t.p[i - 1] = 0;

            if (t.p[0] == 0 && t.p[1] == 1 && t.p[2] == 2 && t.p[3] == 3 &&
                t.p[4] == 4 && t.p[5] == 5 && t.p[6] == 6 && t.p[7] == 7) {
              cout << t.t << endl;
              flg = false;
              break;
            }

            if (!memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]]) {
              q.push(t);
              memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]] =
                  true;
            }

            t.p[i - 1] = t.p[i];
            t.p[i] = 0;
          }

          if (i != 3 && i != 7) {
            t.p[i] = t.p[i + 1];
            t.p[i + 1] = 0;

            if (t.p[0] == 0 && t.p[1] == 1 && t.p[2] == 2 && t.p[3] == 3 &&
                t.p[4] == 4 && t.p[5] == 5 && t.p[6] == 6 && t.p[7] == 7) {
              cout << t.t << endl;
              flg = false;
              break;
            }

            if (!memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]]) {
              q.push(t);
              memo[t.p[0]][t.p[1]][t.p[2]][t.p[3]][t.p[4]][t.p[5]][t.p[6]] =
                  true;
            }

            t.p[i + 1] = t.p[i];
            t.p[i] = 0;
          }

          break;
        }
      }

      if (!flg)
        break;

      q.pop();
    }
  }

  return 0;
}