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

/*

        ??????????£???§??????????????´?????????????????????
        ???????????±???????±???????????????????????????¢

        ??????????????§break ??§???????????????
         <-------- ????????¢

         TIME LIMITED
*/

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

int flg[51][51][51][51];

struct Twins {
  int tax, tay;
  int kax, kay;
  int cnt;
};

queue<Twins> que;

bool check(int y1, int x1, int y2, int x2) { //?????§????????£?????¢?´¢??????

  if (flg[y1][x1][y2][x2] == 0)
    return true;
  return false;
}

int main(void) {

  int x, y;
  int tx, ty;
  int kx, ky;
  Twins twins;

  int y_temp[4] = {-1, +1, 0, 0}; //????????????
  int x_temp[4] = {0, 0, -1, +1}; //????????????

  while (cin >> x >> y && x != 0 && y != 0) {

    memset(flg, 0, sizeof(flg));

    while (!que.empty())
      que.pop();
    int map[52][52];
    memset(map, 1, sizeof(map));

    cin >> tx >> ty >> kx >> ky;

    twins.cnt = 0, twins.tax = tx, twins.tay = ty, twins.kax = kx,
    twins.kay = ky;

    for (int i = 1; i < y + 1; i++) {
      for (int j = 1; j < x + 1; j++)
        cin >> map[i][j];
    }

    que.push(twins);
    flg[que.front().tay][que.front().tax][que.front().kay][que.front().kax] = 1;

    while (1) {

      if (que.front().cnt >= 100) {
        break;
      }
      if (que.front().kax == que.front().tax &&
          que.front().kay == que.front().tay) {
        break;
      }

      for (int i = 0; i < 4; i++) {
        if (map[que.front().tay + y_temp[i]][que.front().tax + x_temp[i]] ==
            0) { // T???????????????????£???????
          if (map[que.front().kay - y_temp[i]][que.front().kax - x_temp[i]] ==
              0) { // K???????????????????£???????
            if (check(que.front().tay + y_temp[i], que.front().tax + x_temp[i],
                      que.front().kay - y_temp[i],
                      que.front().kax - x_temp[i])) {
              twins.tay = que.front().tay + y_temp[i],
              twins.tax = que.front().tax + x_temp[i],
              twins.kay = que.front().kay - y_temp[i],
              twins.kax = que.front().kax - x_temp[i];
              twins.cnt = que.front().cnt + 1;
              que.push(twins);
              flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
            }
          } else if (check(que.front().tay + y_temp[i],
                           que.front().tax + x_temp[i], que.front().kay,
                           que.front().kax)) {
            twins.tay = que.front().tay + y_temp[i],
            twins.tax = que.front().tax + x_temp[i],
            twins.kay = que.front().kay, twins.kax = que.front().kax;
            twins.cnt = que.front().cnt + 1;
            que.push(twins);
            flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
          }
        } else if (map[que.front().kay - y_temp[i]]
                      [que.front().kax - x_temp[i]] ==
                   0) { // K???????????????????£???????
          if (check(que.front().tay, que.front().tax,
                    que.front().kay - y_temp[i], que.front().kax - x_temp[i])) {
            twins.tay = que.front().tay, twins.tax = que.front().tax,
            twins.kay = que.front().kay - y_temp[i],
            twins.kax = que.front().kax - x_temp[i];
            twins.cnt = que.front().cnt + 1;
            que.push(twins);
            flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
          }
        }
      }

      que.pop();
      if (que.empty())
        break;
    }

    if (que.empty() || que.front().cnt >= 100)
      cout << "NA" << endl;
    else
      cout << que.front().cnt << endl;
  }
}

Error: TLE

Fixed submission:

/*

        ??????????£???§??????????????´?????????????????????
        ???????????±???????±???????????????????????????¢

        ??????????????§break ??§???????????????

*/

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

int flg[51][51][51][51];

struct Twins {
  int tax, tay;
  int kax, kay;
  int cnt;
};

queue<Twins> que;

bool check(int y1, int x1, int y2, int x2) { //?????§????????£?????¢?´¢??????

  if (flg[y1][x1][y2][x2] == 0)
    return true;
  return false;
}

int main(void) {

  int x, y;
  int tx, ty;
  int kx, ky;
  Twins twins;

  while (cin >> x >> y && x != 0 && y != 0) {

    memset(flg, 0, sizeof(flg));

    while (!que.empty())
      que.pop();
    int map[52][52];
    memset(map, 1, sizeof(map));

    cin >> tx >> ty >> kx >> ky;

    twins.cnt = 0, twins.tax = tx, twins.tay = ty, twins.kax = kx,
    twins.kay = ky;

    for (int i = 1; i < y + 1; i++) {
      for (int j = 1; j < x + 1; j++)
        cin >> map[i][j];
    }

    que.push(twins);
    flg[que.front().tay][que.front().tax][que.front().kay][que.front().kax] = 1;

    while (1) {

      if (que.front().cnt >= 100) {
        break;
      }
      if (que.front().kax == que.front().tax &&
          que.front().kay == que.front().tay) {
        break;
      }

      // T????????????K?????????
      if (map[que.front().tay - 1][que.front().tax] ==
          0) { // T???????????????????£???????
        if (map[que.front().kay + 1][que.front().kax] ==
            0) { // K???????????????????£???????
          if (check(que.front().tay - 1, que.front().tax, que.front().kay + 1,
                    que.front().kax)) {
            twins.tay = que.front().tay - 1, twins.tax = que.front().tax,
            twins.kay = que.front().kay + 1, twins.kax = que.front().kax;
            twins.cnt = que.front().cnt + 1;
            que.push(twins);
            flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
            cout << "1.1" << endl
                 << twins.tax << ' ' << twins.tay << endl
                 << twins.kax << ' ' << twins.kay << endl
                 << endl;
          }
        } else if (check(que.front().tay - 1, que.front().tax, que.front().kay,
                         que.front().kax)) {
          twins.tay = que.front().tay - 1, twins.tax = que.front().tax,
          twins.kay = que.front().kay, twins.kax = que.front().kax;
          twins.cnt = que.front().cnt + 1;
          que.push(twins);
          flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
          cout << "1.2" << endl
               << twins.tax << ' ' << twins.tay << endl
               << twins.kax << ' ' << twins.kay << endl
               << endl;
        }
      } else if (map[que.front().kay + 1][que.front().kax] ==
                 0) { // K???????????????????£???????
        if (check(que.front().tay, que.front().tax, que.front().kay + 1,
                  que.front().kax)) {
          twins.tay = que.front().tay, twins.tax = que.front().tax,
          twins.kay = que.front().kay + 1, twins.kax = que.front().kax;
          twins.cnt = que.front().cnt + 1;
          que.push(twins);
          flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
          cout << "1.3" << endl
               << twins.tax << ' ' << twins.tay << endl
               << twins.kax << ' ' << twins.kay << endl
               << endl;
        }
      }

      // T????????????K?????????
      if (map[que.front().tay + 1][que.front().tax] ==
          0) { // T???????????????????£???????
        if (map[que.front().kay - 1][que.front().kax] ==
            0) { // K???????????????????£???????
          if (check(que.front().tay + 1, que.front().tax, que.front().kay - 1,
                    que.front().kax)) {
            twins.tay = que.front().tay + 1, twins.tax = que.front().tax,
            twins.kay = que.front().kay - 1, twins.kax = que.front().kax;
            twins.cnt = que.front().cnt + 1;
            que.push(twins);
            flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
            cout << "2.1" << endl
                 << twins.tax << ' ' << twins.tay << endl
                 << twins.kax << ' ' << twins.kay << endl
                 << endl;
          }
        } else if (check(que.front().tay + 1, que.front().tax, que.front().kay,
                         que.front().kax)) {
          twins.tay = que.front().tay + 1, twins.tax = que.front().tax,
          twins.kay = que.front().kay, twins.kax = que.front().kax;
          twins.cnt = que.front().cnt + 1;
          que.push(twins);
          flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
          cout << "2.2" << endl
               << twins.tax << ' ' << twins.tay << endl
               << twins.kax << ' ' << twins.kay << endl
               << endl;
        }
      } else if (map[que.front().kay - 1][que.front().kax] ==
                 0) { // K???????????????????£???????
        if (check(que.front().tay, que.front().tax, que.front().kay - 1,
                  que.front().kax)) {
          twins.tay = que.front().tay, twins.tax = que.front().tax,
          twins.kay = que.front().kay - 1, twins.kax = que.front().kax;
          twins.cnt = que.front().cnt + 1;
          que.push(twins);
          flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
          cout << "2.3" << endl
               << twins.tax << ' ' << twins.tay << endl
               << twins.kax << ' ' << twins.kay << endl
               << endl;
        }
      }

      // T????????????K?????????
      if (map[que.front().tay][que.front().tax - 1] ==
          0) { // T???????????????????£???????
        if (map[que.front().kay][que.front().kax + 1] ==
            0) { // K???????????????????£???????
          if (check(que.front().tay, que.front().tax - 1, que.front().kay,
                    que.front().kax + 1)) {
            twins.tay = que.front().tay, twins.tax = que.front().tax - 1,
            twins.kay = que.front().kay, twins.kax = que.front().kax + 1;
            twins.cnt = que.front().cnt + 1;
            que.push(twins);
            flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
            cout << "3.1" << endl
                 << twins.tax << ' ' << twins.tay << endl
                 << twins.kax << ' ' << twins.kay << endl
                 << endl;
          }
        } else if (check(que.front().tay, que.front().tax - 1, que.front().kay,
                         que.front().kax)) {
          twins.tay = que.front().tay, twins.tax = que.front().tax - 1,
          twins.kay = que.front().kay, twins.kax = que.front().kax;
          twins.cnt = que.front().cnt + 1;
          que.push(twins);
          flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
          cout << "3.2" << endl
               << twins.tax << ' ' << twins.tay << endl
               << twins.kax << ' ' << twins.kay << endl
               << endl;
        }
      } else if (map[que.front().kay][que.front().kax + 1] ==
                 0) { // K???????????????????£???????
        if (check(que.front().tay, que.front().tax, que.front().kay,
                  que.front().kax + 1)) {
          twins.tay = que.front().tay, twins.tax = que.front().tax,
          twins.kay = que.front().kay, twins.kax = que.front().kax + 1;
          twins.cnt = que.front().cnt + 1;
          que.push(twins);
          flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
          cout << "3.3" << endl
               << twins.tax << ' ' << twins.tay << endl
               << twins.kax << ' ' << twins.kay << endl
               << endl;
        }
      }

      // T????????????K?????????
      if (map[que.front().tay][que.front().tax + 1] ==
          0) { // T???????????????????£???????
        if (map[que.front().kay][que.front().kax - 1] ==
            0) { // K???????????????????£???????
          if (check(que.front().tay, que.front().tax + 1, que.front().kay,
                    que.front().kax - 1)) {
            twins.tay = que.front().tay, twins.tax = que.front().tax + 1,
            twins.kay = que.front().kay, twins.kax = que.front().kax - 1;
            twins.cnt = que.front().cnt + 1;
            que.push(twins);
            flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
            cout << "4.1" << endl
                 << twins.tax << ' ' << twins.tay << endl
                 << twins.kax << ' ' << twins.kay << endl
                 << endl;
          }
        } else if (check(que.front().tay, que.front().tax + 1, que.front().kay,
                         que.front().kax)) {
          twins.tay = que.front().tay, twins.tax = que.front().tax + 1,
          twins.kay = que.front().kay, twins.kax = que.front().kax;
          twins.cnt = que.front().cnt + 1;
          que.push(twins);
          flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
          cout << "4.2" << endl
               << twins.tax << ' ' << twins.tay << endl
               << twins.kax << ' ' << twins.kay << endl
               << endl;
        }
      } else if (map[que.front().kay][que.front().kax - 1] ==
                 0) { // K???????????????????£???????
        if (check(que.front().tay, que.front().tax, que.front().kay,
                  que.front().kax - 1)) {
          twins.tay = que.front().tay, twins.tax = que.front().tax,
          twins.kay = que.front().kay, twins.kax = que.front().kax - 1;
          twins.cnt = que.front().cnt + 1;
          que.push(twins);
          flg[twins.tay][twins.tax][twins.kay][twins.kax] = 1;
          cout << "4.3" << endl
               << twins.tax << ' ' << twins.tay << endl
               << twins.kax << ' ' << twins.kay << endl
               << endl;
        }
      }

      que.pop();
      if (que.empty())
        break;
    }

    if (que.empty() || que.front().cnt >= 100)
      cout << "NA" << endl;
    else
      cout << que.front().cnt << endl;
  }
}