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

#include <bits/stdc++.h>

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define FILL0(x) memset(x, 0, sizeof(x))
#define FILL1(x) memset(x, -1, sizeof(x))

using namespace std;

typedef long long ll;
typedef pair<ll, ll> P;

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

struct pnt {
  int y;
  int x;
  int warp; // count
};

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout << fixed << setprecision(20);

  int h, w;
  cin >> h >> w;
  pnt s, g;
  cin >> s.y >> s.x;
  cin >> g.y >> g.x;
  s.y--;
  s.x--;
  g.x--;
  g.y--;
  s.warp = 0;

  string maze[h];
  rep(i, h) { cin >> maze[i]; }

  deque<pnt> dq;
  dq.push_front(s);

  int visit[h][w];
  FILL0(visit);

  while (!dq.empty()) {
    while (visit[dq.front().y][dq.front().x] != 0) {
      dq.pop_front();
    }
    pnt c = dq.front();
    dq.pop_front();

    visit[c.y][c.x] = 1;

    if (c.y == g.y && c.x == g.x) {
      cout << c.warp << endl;
      return 0;
    }

    for (int dy = -2; dy <= 2; dy++) {
      for (int dx = -2; dx <= 2; dx++) {
        if (dx == 0 && dy == 0) {
          continue;
        }

        pnt next;
        next.y = c.y + dy;
        next.x = c.x + dx;
        next.warp = c.warp;

        if (next.y > -1 && next.x > -1 && next.y < h && next.x < w &&
            visit[next.y][next.x] == 0 && maze[next.y][next.x] == '.') {
          if (((dy == 0 && abs(dx) == 1) || (dx == 0 && abs(dy) == 1))) {
            dq.push_front(next);
          } else {
            next.warp++;
            dq.push_back(next);
          }
        }
      }
    }
  }

  cout << -1 << endl;

  return 0;
}


Error: 0

Fixed submission:

#include <bits/stdc++.h>

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define FILL0(x) memset(x, 0, sizeof(x))
#define FILL1(x) memset(x, -1, sizeof(x))

using namespace std;

typedef long long ll;
typedef pair<ll, ll> P;

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

struct pnt {
  int y;
  int x;
  int warp; // count
};

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout << fixed << setprecision(20);

  int h, w;
  cin >> h >> w;
  pnt s, g;
  cin >> s.y >> s.x;
  cin >> g.y >> g.x;
  s.y--;
  s.x--;
  g.x--;
  g.y--;

  string maze[h];
  rep(i, h) { cin >> maze[i]; }

  queue<pnt> queque;
  queque.push(s);

  int visit[h][w];
  FILL0(visit);

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

  int dxx[4] = {-1, 1, 1, -1};
  int dyy[4] = {1, -1, 1, 1};

  while (!queque.empty()) {

    while (visit[queque.front().y][queque.front().x] == 1) {
      queque.pop();
    }

    if (queque.empty()) {
      break;
    }

    queue<pnt> que;
    que.push(queque.front());
    queque.pop();

    while (!que.empty()) {
      pnt c = que.front();
      que.pop();

      if (c.y == g.y && c.x == g.x) {
        cout << c.warp << endl;
        return 0;
      }

      rep(i, 4) {
        pnt next;
        next.y = c.y + dy[i];
        next.x = c.x + dx[i];
        next.warp = c.warp;

        pnt nextnext;
        nextnext.y = c.y + 2 * dy[i];
        nextnext.x = c.x + 2 * dx[i];
        nextnext.warp = next.warp + 1;

        pnt nextnextnext;
        nextnextnext.y = c.y + dyy[i];
        nextnextnext.x = c.x + dxx[i];
        nextnextnext.warp = next.warp + 1;

        pnt nextnextnextnext;
        nextnextnextnext.y = c.y + 2 * dyy[i];
        nextnextnextnext.x = c.x + 2 * dxx[i];
        nextnextnextnext.warp = next.warp + 1;

        if (visit[next.y][next.x] == 0 && next.y > -1 && next.x > -1 &&
            next.y < h && next.x < w && maze[next.y][next.x] == '.') {
          visit[next.y][next.x] = 1;
          que.push(next);
        } else if (visit[nextnext.y][nextnext.x] == 0 && nextnext.x > -1 &&
                   nextnext.y > -1 && nextnext.y < h && nextnext.x < w &&
                   maze[nextnext.y][nextnext.x] == '.') {
          queque.push(nextnext);
        }

        if (visit[nextnextnext.y][nextnextnext.x] == 0 && nextnextnext.x > -1 &&
            nextnextnext.y > -1 && nextnextnext.y < h && nextnextnext.x < w &&
            maze[nextnextnext.y][nextnextnext.x] == '.') {
          queque.push(nextnextnext);
        }

        if (visit[nextnextnextnext.y][nextnextnextnext.x] == 0 &&
            nextnextnextnext.x > -1 && nextnextnextnext.y > -1 &&
            nextnextnextnext.y < h && nextnextnextnext.x < w &&
            maze[nextnextnextnext.y][nextnextnextnext.x] == '.') {
          queque.push(nextnextnextnext);
        }
      }
    }
  }

  cout << -1 << endl;

  return 0;
}