Problem p02579 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

int main() {
  /* 頂点を探索するときに使う(右, 下, 左, 上) */
  const int dx[4] = {1, 0, -1, 0};
  const int dy[4] = {0, 1, 0, -1};

  int h, w;
  int cw, ch;
  int dw, dh;
  std::cin >> h >> w >> cw >> ch >> dw >> dh;
  --cw, --ch, --dw, --dh; // 0-indexed

  std::vector<std::string> maze(h);
  for (int i = 0; i < h; ++i)
    std::cin >> maze[i];

  const int INF = 1e9;

  // 距離と状態を管理
  std::vector<std::vector<int>> dist(h, std::vector<int>(w, INF));
  std::deque<std::pair<int, int>> q;

  // スタート地点のノード
  q.push_front(std::make_pair(ch, cw));
  dist[ch][cw] = 0;

  while (!q.empty()) {
    std::pair<int, int> v = q.front();
    q.pop_front();
    int ci = v.first;
    int cj = v.second;
    int d = dist[ci][cj]; // 現在頂点の始点からの距離

    /* コスト0で行ける頂点を探索 */
    for (int i = 0; i < 4; ++i) {
      int ci_next = ci + dy[i];
      int cj_next = cj + dx[i];
      if (cj_next < 0 || cj_next >= w)
        continue; // 横方向にはみ出てたらskip
      if (ci_next < 0 || ci_next >= h)
        continue; // 縦方向にはみ出てたらskip
      if (maze[ci_next][cj_next] == '#')
        continue; // 壁の場合はskip
      if (dist[ci_next][cj_next] <= d)
        continue; // 今見ている頂点と同じコスト以下ならskip
      dist[ci_next][cj_next] = d;
      q.push_front(std::make_pair(ci_next, cj_next));
    }

    // 5近傍を探索
    for (int di = -2; di <= 2; ++di) {
      for (int dj = -2; dj <= 2; ++dj) {
        int ci_next = ci + di;
        int cj_next = cj + dj;
        if (cj_next < 0 || cj_next >= w)
          continue; // 横方向にはみ出てたらskip
        if (ci_next < 0 || ci_next >= h)
          continue; // 縦方向にはみ出てたらskip
        if (maze[ci_next][cj_next] == '#')
          continue; // 壁の場合はskip
        if (dist[ci_next][cj_next] <= d + 1)
          continue; // 今見ている頂点と同じコスト以下ならskip
        dist[ci_next][cj_next] = d + 1;
        q.push_back(std::make_pair(ci_next, cj_next));
      }
    }
  }

  int ans = dist[dh][dw];
  if (ans == INF)
    ans = -1;

  std::cout << ans << std::endl << std::flush;

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>

int main() {
  /* 頂点を探索するときに使う(右, 下, 左, 上) */
  const int dx[4] = {1, 0, -1, 0};
  const int dy[4] = {0, 1, 0, -1};

  int h, w;
  int cw, ch;
  int dw, dh;
  std::cin >> h >> w >> ch >> cw >> dh >> dw;
  --cw, --ch, --dw, --dh; // 0-indexed

  std::vector<std::string> maze(h);
  for (int i = 0; i < h; ++i)
    std::cin >> maze[i];

  const int INF = 1e9;

  // 距離と状態を管理
  std::vector<std::vector<int>> dist(h, std::vector<int>(w, INF));
  std::deque<std::pair<int, int>> q;

  // スタート地点のノード
  q.push_front(std::make_pair(ch, cw));
  dist[ch][cw] = 0;

  while (!q.empty()) {
    std::pair<int, int> v = q.front();
    q.pop_front();
    int ci = v.first;
    int cj = v.second;
    int d = dist[ci][cj]; // 現在頂点の始点からの距離

    /* コスト0で行ける頂点を探索 */
    for (int i = 0; i < 4; ++i) {
      int ci_next = ci + dy[i];
      int cj_next = cj + dx[i];
      if (cj_next < 0 || cj_next >= w)
        continue; // 横方向にはみ出てたらskip
      if (ci_next < 0 || ci_next >= h)
        continue; // 縦方向にはみ出てたらskip
      if (maze[ci_next][cj_next] == '#')
        continue; // 壁の場合はskip
      if (dist[ci_next][cj_next] <= d)
        continue; // 今見ている頂点と同じコスト以下ならskip
      dist[ci_next][cj_next] = d;
      q.push_front(std::make_pair(ci_next, cj_next));
    }

    // 5近傍を探索
    for (int di = -2; di <= 2; ++di) {
      for (int dj = -2; dj <= 2; ++dj) {
        int ci_next = ci + di;
        int cj_next = cj + dj;
        if (cj_next < 0 || cj_next >= w)
          continue; // 横方向にはみ出てたらskip
        if (ci_next < 0 || ci_next >= h)
          continue; // 縦方向にはみ出てたらskip
        if (maze[ci_next][cj_next] == '#')
          continue; // 壁の場合はskip
        if (dist[ci_next][cj_next] <= d + 1)
          continue; // 今見ている頂点と同じコスト以下ならskip
        dist[ci_next][cj_next] = d + 1;
        q.push_back(std::make_pair(ci_next, cj_next));
      }
    }
  }

  int ans = dist[dh][dw];
  if (ans == INF)
    ans = -1;

  std::cout << ans << std::endl << std::flush;

  return 0;
}