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

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
#define mem(a, b) memset(a, b, sizeof(a))
typedef long long LL;
typedef pair<int, int> PII;
#define X first
#define Y second
inline int read() {
  int x = 0, f = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-')
      f = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return x * f;
}
const int maxn = 3010;
int n, m, dis[maxn][maxn], dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
bool vis[maxn][maxn];
PII s, t;
char pic[maxn][maxn];
bool legal(int x, int y) {
  return x >= 0 && x < n && y >= 0 && y < m && pic[x][y] == '.';
}
void bfs(int x, int y) {
  dis[x][y] = 0;
  vis[x][y] = 1;
  queue<PII> Q;
  vector<PII> V;
  Q.push(make_pair(x, y));
  while (Q.size()) {
    PII now = Q.front();
    Q.pop();
    int nx = now.X, ny = now.Y;
    int ok = 0;
    for (int i = 0; i < 4; i++)
      if (legal(nx + dx[i], ny + dy[i])) {
        ok++;
        if (!vis[nx + dx[i]][ny + dy[i]])
          vis[nx + dx[i]][ny + dy[i]] = 1,
                               dis[nx + dx[i]][ny + dy[i]] = dis[nx][ny],
                               Q.push(make_pair(nx + dx[i], ny + dy[i]));
      }
    if (ok < 4)
      V.push_back(make_pair(nx, ny));
    if (Q.empty()) {
      for (int k = 0; k < V.size(); k++) {
        int nx = V[k].X, ny = V[k].Y;
        for (int i = -2; i <= 2; i++)
          for (int j = -2; j <= 2; j++)
            if (legal(nx + i, ny + j)) {
              if (dis[nx + i][ny + j] > dis[nx][ny] + 1) {
                dis[nx + i][ny + j] = dis[nx][ny] + 1;
                vis[nx + i][ny + j] = 1;
                Q.push(make_pair(nx + i, ny + j));
              }
            }
      }
      V.clear();
    }
  }
  return;
}
int main() {
  mem(dis, 42);
  n = read();
  m = read();
  s.X = read() - 1, s.Y = read() - 1;
  t.X = read() - 1, t.Y = read() - 1;
  for (int i = 0; i < n; i++)
    scanf("%s", pic[i]);
  bfs(s.X, s.Y);
  //	for(int i=0;i<n;i++)
  //	{
  //		for(int j=0;j<n;j++)printf("%d ",dis[i][j]);
  //		puts("");
  //	}
  if (!vis[t.X][t.Y])
    puts("-1");
  else
    printf("%d\\n", dis[t.X][t.Y]);
  return 0;
}
/*

*/


Error: 0

Fixed submission:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
#define mem(a, b) memset(a, b, sizeof(a))
typedef long long LL;
typedef pair<int, int> PII;
#define X first
#define Y second
inline int read() {
  int x = 0, f = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-')
      f = -1;
    c = getchar();
  }
  while (isdigit(c)) {
    x = x * 10 + c - '0';
    c = getchar();
  }
  return x * f;
}
const int maxn = 3010;
int n, m, dis[maxn][maxn], dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
bool vis[maxn][maxn];
PII s, t;
char pic[maxn][maxn];
bool legal(int x, int y) {
  return x >= 0 && x < n && y >= 0 && y < m && pic[x][y] == '.';
}
void surge(int nx, int ny) {}
bool bfs(int x, int y) {
  dis[x][y] = 0;
  vis[x][y] = 1;
  queue<PII> Q;
  vector<PII> V;
  Q.push(make_pair(x, y));
  while (Q.size()) {
    PII now = Q.front();
    Q.pop();
    int nx = now.X, ny = now.Y;
    int ok = 0;
    for (int i = 0; i < 4; i++)
      if (legal(nx + dx[i], ny + dy[i])) {
        ok++;
        if (!vis[nx + dx[i]][ny + dy[i]])
          vis[nx + dx[i]][ny + dy[i]] = 1,
                               dis[nx + dx[i]][ny + dy[i]] = dis[nx][ny],
                               Q.push(make_pair(nx + dx[i], ny + dy[i]));
      }
    if (ok < 4)
      V.push_back(make_pair(nx, ny));
    if (Q.empty()) {
      for (int k = 0; k < V.size(); k++) {
        int nx = V[k].X, ny = V[k].Y;
        for (int i = -2; i <= 2; i++)
          for (int j = -2; j <= 2; j++)
            if (legal(nx + i, ny + j)) {
              if (dis[nx + i][ny + j] > dis[nx][ny] + 1) {
                dis[nx + i][ny + j] = dis[nx][ny] + 1;
                vis[nx + i][ny + j] = 1;
                Q.push(make_pair(nx + i, ny + j));
              }
            }
      }
      V.clear();
    }
  }
}
int main() {
  mem(dis, 42);
  n = read();
  m = read();
  s.X = read() - 1, s.Y = read() - 1;
  t.X = read() - 1, t.Y = read() - 1;
  for (int i = 0; i < n; i++)
    scanf("%s", pic[i]);
  bfs(s.X, s.Y);
  //	for(int i=0;i<n;i++)
  //	{
  //		for(int j=0;j<n;j++)printf("%d ",dis[i][j]);
  //		puts("");
  //	}
  if (!vis[t.X][t.Y])
    puts("-1");
  else
    printf("%d\\n", dis[t.X][t.Y]);
  return 0;
}
/*

*/