Problem p00223 (C++) — buggy submission, verdict: Runtime Error

#include <iostream>
#include <queue>
#include <stdio.h>
#include <string.h>
using namespace std;
struct Y {
  int hx, hy, rx, ry, t;
};
int c[51][51][51][51], mp[52][52];
int main() {
  int w, h, i, j, a[2] = {1, -1}, b[2];
  Y e;
  while (1) {
    queue<Y> q;
    cin >> w >> h;
    if (w == 0 && h == 0)
      break;
    cin >> e.hx >> e.hy >> e.rx >> e.ry;
    e.t = 0;
    q.push(e);
    memset(c, 0, sizeof(c));
    memset(mp, -1, sizeof(mp));
    for (i = 1; i <= h; i++) {
      for (j = 1; j <= w; j++) {
        cin >> mp[i][j];
      }
    }
    while (!q.empty()) {
      e = q.front();
      q.pop();
      c[e.hy][e.hx][e.ry][e.rx] = 1;
      if (e.t >= 100 || e.hx == e.rx && e.hy == e.ry)
        break;
      e.t++;
      for (i = 0; i < 2; i++) {
        if (mp[e.hy + a[i]][e.hx] == 0 &&
            c[e.hy + a[i]][e.hx][e.ry - a[i]][e.rx] == 0 &&
            mp[e.ry - a[i]][e.rx] == 0) {
          b[0] = 0;
          b[1] = 0;
          if (mp[e.hy + a[i]][e.hx] == 0) {
            e.hy += a[i];
            b[0] = 1;
          }
          if (mp[e.ry - a[i]][e.rx] == 0) {
            e.ry -= a[i];
            b[1] = 1;
          }
          c[e.hy][e.hx][e.ry][e.rx] = 1;
          q.push(e);
          if (b[0] == 1)
            e.hy -= a[i];
          if (b[1] == 1)
            e.ry += a[i];
        }
        if (mp[e.ry - a[i]][e.rx] == 0 &&
            c[e.hy][e.hx][e.ry - a[i]][e.rx] == 0 &&
            mp[e.hy + a[i]][e.hx] != 0) {
          b[0] = 0;
          b[1] = 0;
          if (mp[e.hy + a[i]][e.hx] == 0) {
            e.hy += a[i];
            b[0] = 1;
          }
          if (mp[e.ry - a[i]][e.rx] == 0) {
            e.ry -= a[i];
            b[1] = 1;
          }
          c[e.hy][e.hx][e.ry][e.rx] = 1;
          q.push(e);
          if (b[0] == 1)
            e.hy -= a[i];
          if (b[1] == 1)
            e.ry += a[i];
        }
        if (mp[e.hy + a[i]][e.hx] == 0 && mp[e.ry - a[i]][e.rx] != 0 &&
            c[e.hy + a[i]][e.hx][e.ry][e.rx] == 0) {
          b[0] = 0;
          b[1] = 0;
          if (mp[e.hy + a[i]][e.hx] == 0) {
            e.hy += a[i];
            b[0] = 1;
          }
          if (mp[e.ry - a[i]][e.rx] == 0) {
            e.ry -= a[i];
            b[1] = 1;
          }
          c[e.hy][e.hx][e.ry][e.rx] = 1;
          q.push(e);
          if (b[0] == 1)
            e.hy -= a[i];
          if (b[1] == 1)
            e.ry += a[i];
        }

        if (mp[e.hy][e.hx + a[i]] == 0 && mp[e.ry][e.rx - a[i]] == 0 &&
            c[e.hy][e.hx + a[i]][e.ry][e.rx - a[i]] == 0) {
          b[0] = 0;
          b[1] = 0;
          if (mp[e.hy][e.hx + a[i]] == 0) {
            e.hx += a[i];
            b[0] = 1;
          }
          if (mp[e.ry][e.rx - a[i]] == 0) {
            e.rx -= a[i];
            b[1] = 1;
          }
          c[e.hy][e.hx][e.ry][e.rx] = 1;
          q.push(e);
          if (b[0] == 1)
            e.hx -= a[i];
          if (b[1] == 1)
            e.rx += a[i];
        }
        if (mp[e.hy][e.hx + a[i]] == 0 &&
            c[e.hy][e.hx + a[i]][e.ry][e.rx] == 0 &&
            mp[e.ry][e.rx - a[i]] != 0) {
          b[0] = 0;
          b[1] = 0;
          if (mp[e.hy][e.hx + a[i]] == 0) {
            e.hx += a[i];
            b[0] = 1;
          }
          if (mp[e.ry][e.rx - a[i]] == 0) {
            e.rx -= a[i];
            b[1] = 1;
          }
          c[e.hy][e.hx][e.ry][e.rx] = 1;
          q.push(e);
          if (b[0] == 1)
            e.hx -= a[i];
          if (b[1] == 1)
            e.rx += a[i];
        }
        if (mp[e.ry][e.rx - a[i]] == 0 && mp[e.hy][e.hx + a[i]] != 0 &&
            c[e.hy][e.hx][e.ry][e.rx - a[i]] == 0) {
          b[0] = 0;
          b[1] = 0;
          if (mp[e.hy][e.hx + a[i]] == 0) {
            e.hx += a[i];
            b[0] = 1;
          }
          if (mp[e.ry][e.rx - a[i]] == 0) {
            e.rx -= a[i];
            b[1] = 1;
          }
          c[e.hy][e.hx][e.ry][e.rx] = 1;
          q.push(e);
          if (b[0] == 1)
            e.hx -= a[i];
          if (b[1] == 1)
            e.rx += a[i];
        }
      }
      e.t--;
    }
    if (e.hy == e.ry && e.hx == e.rx)
      cout << e.t << endl;
    else
      cout << "NA" << endl;
  }
  return 0;
}

Error: 0

Fixed submission:

#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < n; i++)
#define rep1(i, n) for (int i = 1; i <= n; i++)
struct X {
  int tx, ty, t, kx, ky;
};
int java[51][51][51][51] = {0};
int main() {
  int w, h, map[52][52] = {0};
  int mx[4] = {0, 1, 0, -1}, my[4] = {1, 0, -1, 0};
  while (1) {
    queue<X> que;
    X c;
    cin >> w >> h;
    if (w == 0 && h == 0)
      break;
    memset(java, 0, sizeof(java));
    memset(map, -1, sizeof(map));
    cin >> c.tx >> c.ty >> c.kx >> c.ky;
    c.t = 0;
    que.push(c);
    rep1(i, h) {
      rep1(j, w) { cin >> map[i][j]; }
    }
    while (!que.empty()) {
      c = que.front();
      que.pop();
      java[c.tx][c.ty][c.kx][c.ky] = 1;
      if (c.tx == c.kx && c.ty == c.ky || c.t >= 100) {
        break;
      }
      c.t++;
      rep(i, 4) {
        if (java[c.tx + mx[i]][c.ty + my[i]][c.kx - mx[i]][c.ky - my[i]] == 0 &&
            map[c.tx + mx[i]][c.ty + my[i]] == 0 &&
            map[c.kx - mx[i]][c.ky - my[i]] == 0) {
          c.tx += mx[i];
          c.ty += my[i];
          c.kx -= mx[i];
          c.ky -= my[i];
          que.push(c);
          java[c.tx][c.ty][c.kx][c.ky] = 1;
          c.tx -= mx[i];
          c.ty -= my[i];
          c.kx += mx[i];
          c.ky += my[i];
        } else if (java[c.tx][c.ty][c.kx - mx[i]][c.ky - my[i]] == 0 &&
                   map[c.tx + mx[i]][c.ty + my[i]] != 0 &&
                   map[c.kx - mx[i]][c.ky - my[i]] == 0) {
          c.kx -= mx[i];
          c.ky -= my[i];
          que.push(c);
          java[c.tx][c.ty][c.kx][c.ky] = 1;
          c.kx += mx[i];
          c.ky += my[i];
        } else if (java[c.tx + mx[i]][c.ty + my[i]][c.kx][c.ky] == 0 &&
                   map[c.tx + mx[i]][c.ty + my[i]] == 0 &&
                   map[c.kx - mx[i]][c.ky - my[i]] != 0) {
          c.tx += mx[i];
          c.ty += my[i];
          que.push(c);
          java[c.tx][c.ty][c.kx][c.ky] = 1;
          c.tx -= mx[i];
          c.ty -= my[i];
        }
      }
    }
    if (c.tx == c.kx && c.ky == c.ty)
      cout << c.t << endl;
    else
      cout << "NA" << endl;
  }
  return 0;
}