Problem p02579 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int MAX_HW = 1005;
char S[MAX_HW][MAX_HW];
int ans[MAX_HW][MAX_HW];
int H, W;
queue<P> Q[10005];
int dx[5] = {-2, -1, 0, 1, 2}, dy[5] = {-2, -1, 0, 1, 2};
int dx2[4] = {0, 1, 0, -1}, dy2[4] = {1, 0, -1, 0};
int now = 0;

void init() {
  rep(i, MAX_HW) {
    rep(j, MAX_HW) { ans[i][j] = 1e9; }
  }
}

void dfs(int i, int j, int c) {
  // cout << i << " " << j << endl;
  ans[i][j] = min(ans[i][j], c);
  rep(ii, 5) {
    rep(jj, 5) {
      int newi = i + dx[ii], newj = j + dy[jj];
      if (newi >= 0 && newi < H && newj >= 0 && newj < W &&
          S[newi][newj] == '.') {
        if (ans[newi][newj] > c) {
          ans[newi][newj] = c + 1;
          Q[now + 1].push(P(newi, newj));
        }
      }
    }
  }

  rep(ii, 4) {
    int newi = i + dx2[ii], newj = j + dy2[ii];
    // cout << newi << " " << newj << endl;
    if (newi >= 0 && newi < H && newj >= 0 && newj < W &&
        S[newi][newj] == '.') {
      // cout << "b" << endl;
      if (ans[newi][newj] > c) {
        dfs(newi, newj, c);
      }
    }
  }
  return;
}

int main() {
  init();
  cin >> H >> W;
  int Ch, Cw, Dh, Dw;
  cin >> Ch >> Cw >> Dh >> Dw;
  rep(i, H) {
    rep(j, W) { cin >> S[i][j]; }
  }
  dfs(Ch - 1, Cw - 1, 0);
  int cnt = 1;
  while (true) {
    now++;
    while (!Q[now].empty()) {
      P p = Q[now].front();
      Q[now].pop();
      // cout << "aa" << p.first << " " << p.second << " " <<
      // ans[p.first][p.second] << " " << cnt << endl;
      if (ans[p.first][p.second] == cnt) {
        // cout << "b" << endl;
        dfs(p.first, p.second, cnt);
      }
    }
    if (Q[now + 1].empty())
      break;
    cnt++;
  }

  /*
  rep(i,H)
  {
          rep(j,W)
          {
                  cout << ans[i][j] << " ";
          }
          cout << endl;
  }
  */
  if (ans[Dh - 1][Dw - 1] != 1e9)
    cout << ans[Dh - 1][Dw - 1] << endl;
  else
    cout << -1 << endl;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int MAX_HW = 1005;
char S[MAX_HW][MAX_HW];
int ans[MAX_HW][MAX_HW];
int H, W;
queue<P> Q[500000];
int dx[5] = {-2, -1, 0, 1, 2}, dy[5] = {-2, -1, 0, 1, 2};
int dx2[4] = {0, 1, 0, -1}, dy2[4] = {1, 0, -1, 0};
int now = 0;

void init() {
  rep(i, MAX_HW) {
    rep(j, MAX_HW) { ans[i][j] = 1e9; }
  }
}

void dfs(int i, int j, int c) {
  // cout << i << " " << j << endl;
  ans[i][j] = min(ans[i][j], c);
  rep(ii, 5) {
    rep(jj, 5) {
      int newi = i + dx[ii], newj = j + dy[jj];
      if (newi >= 0 && newi < H && newj >= 0 && newj < W &&
          S[newi][newj] == '.') {
        if (ans[newi][newj] > c) {
          ans[newi][newj] = c + 1;
          Q[now + 1].push(P(newi, newj));
        }
      }
    }
  }

  rep(ii, 4) {
    int newi = i + dx2[ii], newj = j + dy2[ii];
    // cout << newi << " " << newj << endl;
    if (newi >= 0 && newi < H && newj >= 0 && newj < W &&
        S[newi][newj] == '.') {
      // cout << "b" << endl;
      if (ans[newi][newj] > c) {
        dfs(newi, newj, c);
      }
    }
  }
  return;
}

int main() {
  init();
  cin >> H >> W;
  int Ch, Cw, Dh, Dw;
  cin >> Ch >> Cw >> Dh >> Dw;
  rep(i, H) {
    rep(j, W) { cin >> S[i][j]; }
  }
  dfs(Ch - 1, Cw - 1, 0);
  int cnt = 1;
  while (true) {
    now++;
    while (!Q[now].empty()) {
      P p = Q[now].front();
      Q[now].pop();
      // cout << "aa" << p.first << " " << p.second << " " <<
      // ans[p.first][p.second] << " " << cnt << endl;
      if (ans[p.first][p.second] == cnt) {
        // cout << "b" << endl;
        dfs(p.first, p.second, cnt);
      }
    }
    if (Q[now + 1].empty())
      break;
    cnt++;
  }

  /*
  rep(i,H)
  {
          rep(j,W)
          {
                  cout << ans[i][j] << " ";
          }
          cout << endl;
  }
  */
  if (ans[Dh - 1][Dw - 1] != 1e9)
    cout << ans[Dh - 1][Dw - 1] << endl;
  else
    cout << -1 << endl;
  return 0;
}