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

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define sc second
#define pb push_back
typedef pair<int, int> P;
typedef pair<P, P> PP;
typedef pair<int, PP> PPP;
int dx[4] = {-1, 0, 0, 1};
int dy[4] = {0, -1, 1, 0};
int S[51][51][51][51];
int S1[51][51][51][51];
vector<PP> Now[101];
int main() {
  while (true) {
    int X, Y;
    int tx;
    int ty;
    int kx;
    int ky;
    scanf("%d%d", &X, &Y);
    if (X == 0 && Y == 0)
      break;
    scanf("%d%d%d%d", &tx, &ty, &kx, &ky);
    tx--;
    ty--;
    kx--;
    ky--;
    int grid[51][51];
    for (int i = 0; i < Y; i++) {
      for (int j = 0; j < X; j++) {
        scanf("%d", &grid[i][j]);
      }
    }

    for (int i = 0; i < Y; i++) {
      for (int j = 0; j < X; j++) {
        for (int k = 0; k < Y; k++) {
          for (int l = 0; l < X; l++) {
            S[i][j][k][l] = 1001;
            S1[i][j][k][l] = 1001;
          }
        }
      }
    }

    PP x;
    x.fi.sc = tx;
    x.fi.fi = ty;
    x.sc.sc = kx;
    x.sc.fi = ky;
    Now[0].pb(x);
    int ans = 1001;
    bool F = true;
    for (int i = 0; i < 100; i++) {
      for (int j = 0; F && (j < (int)Now[i].size()); j++) {
        PP p = Now[i][j];
        if (S[p.fi.fi][p.fi.sc][p.sc.fi][p.sc.sc] <= i)
          continue;
        S[p.fi.fi][p.fi.sc][p.sc.fi][p.sc.sc] = i;

        if (p.fi.fi == p.sc.fi && p.fi.sc == p.sc.sc) {
          ans = i;
          F = false;
        }
        for (int k = 0; k < 4; k++) {
          PP t;
          if (p.fi.fi + dy[k] < 0 || p.fi.fi + dy[k] >= Y ||
              p.fi.sc + dx[k] < 0 || p.fi.sc + dx[k] >= X) {
            t.fi.fi = p.fi.fi;
            t.fi.sc = p.fi.sc;
          } else if (grid[p.fi.fi + dy[k]][p.fi.sc + dx[k]] == 1) {
            t.fi.fi = p.fi.fi;
            t.fi.sc = p.fi.sc;
          } else {
            t.fi.fi = p.fi.fi + dy[k];
            t.fi.sc = p.fi.sc + dx[k];
          }
          if (p.sc.fi - dy[k] < 0 || p.sc.fi - dy[k] >= Y ||
              p.sc.sc - dx[k] < 0 || p.sc.sc - dx[k] >= X) {
            t.sc.fi = p.sc.fi;
            t.sc.sc = p.sc.sc;
          } else if (grid[p.sc.fi - dy[k]][p.sc.sc - dx[k]] == 1) {
            t.sc.fi = p.sc.fi;
            t.sc.sc = p.sc.sc;
          } else {
            t.sc.fi = p.sc.fi - dy[k];
            t.sc.sc = p.sc.sc - dx[k];
          }
          if (S[t.fi.fi][t.fi.sc][t.sc.fi][t.sc.sc] <= i)
            continue;
          // if(i==1)printf("%d %d %d %d\\n",t.fi.fi,t.fi.sc,t.sc.fi,t.sc.sc);
          Now[i + 1].pb(t);
        }
      }
      Now[i].clear();
    }
    int i = 100;
    for (int j = 0; j < (int)Now[i].size(); j++) {
      if (Now[i][j].fi.fi == Now[i][j].sc.fi &&
          Now[i][j].fi.sc == Now[i][j].sc.sc) {
        ans = 100;
      }
    }
    Now[101].clear();
    if (ans == 1001)
      printf("NA\\n");
    else
      printf("%d\\n", ans);
  }
  return 0;
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define sc second
#define pb push_back
typedef pair<int, int> P;
typedef pair<P, P> PP;
typedef pair<int, PP> PPP;
int dx[4] = {-1, 0, 0, 1};
int dy[4] = {0, -1, 1, 0};
int S[51][51][51][51];
int S1[51][51][51][51];
vector<PP> Now[101];
int main() {
  while (true) {
    int X, Y;
    int tx;
    int ty;
    int kx;
    int ky;
    scanf("%d%d", &X, &Y);
    if (X == 0 && Y == 0)
      break;
    scanf("%d%d%d%d", &tx, &ty, &kx, &ky);
    tx--;
    ty--;
    kx--;
    ky--;
    int grid[51][51];
    for (int i = 0; i < Y; i++) {
      for (int j = 0; j < X; j++) {
        scanf("%d", &grid[i][j]);
      }
    }

    for (int i = 0; i < Y; i++) {
      for (int j = 0; j < X; j++) {
        for (int k = 0; k < Y; k++) {
          for (int l = 0; l < X; l++) {
            S[i][j][k][l] = 1001;
            S1[i][j][k][l] = 1001;
          }
        }
      }
    }

    PP x;
    x.fi.sc = tx;
    x.fi.fi = ty;
    x.sc.sc = kx;
    x.sc.fi = ky;
    Now[0].pb(x);
    int ans = 1001;
    bool F = true;
    for (int i = 0; i < 100; i++) {
      for (int j = 0; F && (j < (int)Now[i].size()); j++) {
        PP p = Now[i][j];
        S[p.fi.fi][p.fi.sc][p.sc.fi][p.sc.sc] = i;
        if (p.fi.fi == p.sc.fi && p.fi.sc == p.sc.sc) {
          ans = i;
          F = false;
        }
        for (int k = 0; k < 4; k++) {
          PP t;
          if (p.fi.fi + dy[k] < 0 || p.fi.fi + dy[k] >= Y ||
              p.fi.sc + dx[k] < 0 || p.fi.sc + dx[k] >= X) {
            t.fi.fi = p.fi.fi;
            t.fi.sc = p.fi.sc;
          } else if (grid[p.fi.fi + dy[k]][p.fi.sc + dx[k]] == 1) {
            t.fi.fi = p.fi.fi;
            t.fi.sc = p.fi.sc;
          } else {
            t.fi.fi = p.fi.fi + dy[k];
            t.fi.sc = p.fi.sc + dx[k];
          }
          if (p.sc.fi - dy[k] < 0 || p.sc.fi - dy[k] >= Y ||
              p.sc.sc - dx[k] < 0 || p.sc.sc - dx[k] >= X) {
            t.sc.fi = p.sc.fi;
            t.sc.sc = p.sc.sc;
          } else if (grid[p.sc.fi - dy[k]][p.sc.sc - dx[k]] == 1) {
            t.sc.fi = p.sc.fi;
            t.sc.sc = p.sc.sc;
          } else {
            t.sc.fi = p.sc.fi - dy[k];
            t.sc.sc = p.sc.sc - dx[k];
          }
          if (S[t.fi.fi][t.fi.sc][t.sc.fi][t.sc.sc] <= i)
            continue;
          // if(i==1)printf("%d %d %d %d\\n",t.fi.fi,t.fi.sc,t.sc.fi,t.sc.sc);
          Now[i + 1].pb(t);
        }
      }
      Now[i].clear();
    }
    int i = 100;
    for (int j = 0; j < (int)Now[i].size(); j++) {
      if (Now[i][j].fi.fi == Now[i][j].sc.fi &&
          Now[i][j].fi.sc == Now[i][j].sc.sc) {
        ans = 100;
      }
    }
    Now[101].clear();
    if (ans == 1001)
      printf("NA\\n");
    else
      printf("%d\\n", ans);
  }
  return 0;
}