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

/*#include<cstdio>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
#include<string.h>
#include<string>
#include<vector>
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,0,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];
}
}
for(int i=0;i<=h+1;i++)
{
map[i][0] = 1;
map[i][w + 1] = 1;
}
for(int i=0;i<=w+1;i++)
{
map[0][i] = 1;
map[h + 1][i] = 1;
}
while (!que.empty())
{
c = que.front();
que.pop();
cout<<"T "<<map[c.tx][c.ty]<<' '<<c.tx<<' '<<c.ty<<"K "<<map[c.kx][c.ky]<<'
'<<c.kx<<' '<<c.ky<<endl; java[c.tx][c.ty][c.kx][c.ky] = 1; if (c.tx ==
c.kx&&c.ty == c.ky||c.t >= 100)
{
cout << "FACKYOU!" << endl;
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]] == 1 && 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]] == 1)
{
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;
}*/
#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 ||
            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 ||
            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 ||
            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 ||
            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 <algorithm>
#include <cstdio>
#include <iostream>
#include <math.h>
#include <queue>
#include <string.h>
#include <string>
#include <vector>
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, 0, 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]; }
    }
    for (int i = 0; i <= h + 1; i++) {
      map[i][0] = 1;
      map[i][w + 1] = 1;
    }
    for (int i = 0; i <= w + 1; i++) {
      map[0][i] = 1;
      map[h + 1][i] = 1;
    }
    while (!que.empty()) {
      c = que.front();
      que.pop();
      // cout<<"T "<<map[c.tx][c.ty]<<' '<<c.tx<<' '<<c.ty<<"K
      // "<<map[c.kx][c.ky]<<' '<<c.kx<<' '<<c.ky<<endl;
      java[c.tx][c.ty][c.kx][c.ky] = 1;
      if (c.tx == c.kx && c.ty == c.ky || c.t >= 100) {
        // cout << "FACKYOU!" << endl;
        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]] == 1 &&
                   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]] == 1) {
          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;
}