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

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

int X, Y;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

class State {
public:
  int tx, ty, kx, ky;
  int time;

  State(int tx, int ty, int kx, int ky, int time)
      : tx(tx), ty(ty), kx(kx), ky(ky), time(time) {}
};

bool oor(int x, int y) { return x < 0 || x >= X || y < 0 || y >= Y; }

int main() {
  while (cin >> X >> Y, X || Y) {
    int itx, ity, ikx, iky;
    cin >> itx >> ity >> ikx >> iky;

    bool map[Y][X];
    for (int y = 0; y < Y; y++)
      for (int x = 0; x < X; x++)
        cin >> map[y][x];

    queue<State> q;
    q.push(State(itx - 1, ity - 1, ikx - 1, iky - 1, 0));
    bool v[Y][X][Y][X];
    memset(v, 0, sizeof(v));
    bool f = 0;

    while (!q.empty()) {
      State t = q.front();
      q.pop();
      if (v[t.ty][t.tx][t.ky][t.kx])
        continue;
      if (t.time >= 100) {
        break;
      }

      if (t.tx == t.kx && t.ty == t.ky) {
        cout << t.time << endl;
        f = 1;
        break;
      }
      v[t.ty][t.tx][t.ky][t.kx] = 1;

      for (int i = 0; i < 4; i++) {
        State next = State(t.tx + dx[i], t.ty + dy[i], t.kx + dx[(i + 2) % 4],
                           t.ky + dy[(i + 2) % 4], t.time + 1);
        if (oor(next.tx, next.ty) && oor(next.kx, next.ky))
          continue;
        if (oor(next.tx, next.ty) || map[next.ty][next.tx]) {
          next.tx = t.tx;
          next.ty = t.ty;
        }

        if (oor(next.kx, next.ky) || map[next.ky][next.kx]) {
          next.kx = t.kx;
          next.ky = t.ky;
        }

        if (v[next.ty][next.tx][next.ky][next.kx])
          continue;

        q.push(next);
      }
    }

    if (!f)
      cout << "NA" << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

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

int X, Y;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

class State {
public:
  int tx, ty, kx, ky;
  int time;

  State(int tx, int ty, int kx, int ky, int time)
      : tx(tx), ty(ty), kx(kx), ky(ky), time(time) {}
};

bool oor(int x, int y) { return x < 0 || x >= X || y < 0 || y >= Y; }

int main() {
  while (cin >> X >> Y, X || Y) {
    int itx, ity, ikx, iky;
    cin >> itx >> ity >> ikx >> iky;

    bool map[Y][X];
    for (int y = 0; y < Y; y++)
      for (int x = 0; x < X; x++)
        cin >> map[y][x];

    queue<State> q;
    q.push(State(itx - 1, ity - 1, ikx - 1, iky - 1, 0));
    bool v[Y][X][Y][X];
    memset(v, 0, sizeof(v));
    bool f = 0;

    while (!q.empty()) {
      State t = q.front();
      q.pop();
      if (t.time >= 100) {
        break;
      }

      if (t.tx == t.kx && t.ty == t.ky) {
        cout << t.time << endl;
        f = 1;
        break;
      }
      v[t.ty][t.tx][t.ky][t.kx] = 1;

      for (int i = 0; i < 4; i++) {
        State next = State(t.tx + dx[i], t.ty + dy[i], t.kx + dx[(i + 2) % 4],
                           t.ky + dy[(i + 2) % 4], t.time + 1);
        if (oor(next.tx, next.ty) && oor(next.kx, next.ky))
          continue;
        if (oor(next.tx, next.ty) || map[next.ty][next.tx]) {
          next.tx = t.tx;
          next.ty = t.ty;
        }

        if (oor(next.kx, next.ky) || map[next.ky][next.kx]) {
          next.kx = t.kx;
          next.ky = t.ky;
        }

        if (v[next.ty][next.tx][next.ky][next.kx])
          continue;

        q.push(next);
      }
    }
    if (!f)
      cout << "NA" << endl;
  }
  return 0;
}