Problem p02579 (C++) — buggy submission, verdict: 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;
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};

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

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++;
  }
  */

  deque<pair<P, int>> D;
  D.push_front(make_pair(P(Ch - 1, Cw - 1), 0));
  while (!D.empty()) {
    pair<P, int> p = D.front();
    D.pop_front();
    int i = p.first.first, j = p.first.second, c = p.second;
    if (ans[i][j] < c)
      continue;
    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) {
          ans[newi][newj] = c;
          D.push_front(make_pair(P(newi, newj), 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 + 1) {
            ans[newi][newj] = c + 1;
            D.push_back(make_pair(P(newi, newj), c + 1));
          }
        }
      }
    }
  }

  /*
  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;
}

Error: 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[10000];
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] = 10000; }
  }
}

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;
  rep(i, 10000 - 1) {
    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] != 10000)
    cout << ans[Dh - 1][Dw - 1] << endl;
  else
    cout << -1 << endl;
  return 0;
}