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

#include <bits/stdc++.h>
#define rep(i, n) rep2(i, 0, n)
#define rep2(i, m, n) for (int i = m; i < (n); i++)
typedef long long ll;
using namespace std;

int h, w;
pair<int, int> st, g;   // スタートとゴールの座標
vector<vector<bool>> s; // s: 道ならtrue, 壁ならfalse  dict:
                        // 魔法を何回使えばその座標に行けるか。-1で初期化
vector<vector<int>> dict;
vector<pair<int, int>> ite = {pair<int, int>(1, 0), pair<int, int>(0, 1),
                              pair<int, int>(-1, 0), pair<int, int>(0, -1)};
queue<pair<int, int>> que; // fillで埋めたいところのlist
queue<pair<int, int>>
    next; // 魔法を使ってたどり着ける場所のリスト。次のcntでfillしたい。
queue<pair<int, int>> filled; // 名前通りfillし終わったところ。

void fill(
    int x, int y,
    int num) { // 座標(x, y)から歩いて行ける場所のdictをすべて num にする。
  dict[x][y] = num;
  filled.push(pair<int, int>(x, y));

  rep(i, 4) {
    int x_ = x + ite[i].first;
    int y_ = y + ite[i].second;
    if (x_ < 0 || y_ < 0 || x_ >= h || y_ >= w)
      continue;
    if (s[x_][y_] && dict[x_][y_] == -1)
      fill(x_, y_, num);
  }
}

int main() {

  cin >> h >> w;

  cin >> st.first >> st.second;
  cin >> g.first >> g.second;
  st.first--;
  st.second--;
  g.first--;
  g.second--;

  s.resize(h);
  dict.resize(h);
  rep(i, h) {
    s[i].resize(w);
    dict[i].resize(w);
    rep(j, w) dict[i][j] = -1;
  }

  rep(i, h) {
    rep(j, w) {
      char c;
      cin >> c;
      s[i][j] = bool(c == '.');
    }
  }

  int cnt = 0;

  que.push(st);

  while (1) {

    if (que.empty())
      break;
    while (!que.empty()) {

      int x = que.front().first;
      int y = que.front().second;
      que.pop();

      if (s[x][y])
        fill(x, y, cnt);
    }

    if (dict[g.first][g.second] != -1)
      break;

    while (!filled.empty()) {
      int x = filled.front().first;
      int y = filled.front().second;
      filled.pop();

      rep2(i, -2, 3) {
        rep2(j, -2, 3) {
          if (x + i < 0 || x + i >= h || y + j < 0 || y + j >= w)
            continue;
          if (s[x + i][y + j] && dict[x + i][y + j] == -1)
            que.push(pair<int, int>(x + i, y + j));
        }
      }
    }

    cnt++;
  }

  cout << dict[g.first][g.second] << endl;
}

Error: -11

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, n) rep2(i, 0, n)
#define rep2(i, m, n) for (int i = m; i < (n); i++)
typedef long long ll;
using namespace std;
const ll INF = 1 << 30;

int h, w;
pair<int, int> start, goal;
vector<vector<bool>> s;
vector<vector<int>> dict;
queue<pair<int, int>> que;
int x_ite[4] = {1, 1, 0, 0};
int y_ite[4] = {0, 0, 1, -1};
queue<pair<int, int>> targ;

bool fill(int x, int y, int num) { // 隣接部分を全部 num の数で埋め尽くす。
  if (x < 0 || x >= h || y < 0 || y >= w)
    return 0;
  if (s[x][y] && (dict[x][y] == -1 || dict[x][y] == num)) {
    dict[x][y] = num;
    que.push(pair<int, int>(x, y));
  } else {
    return 0;
  }

  fill(x + 1, y, num);
  fill(x - 1, y, num);
  fill(x, y + 1, num);
  fill(x, y - 1, num);

  return 0;
}

bool search(int num) {
  while (!que.empty()) {

    int x = que.front().first;
    int y = que.front().second;

    rep2(i, -2, 3) {
      rep2(j, -2, 3) {

        if (x + i < 0 || x + i >= h || y + j < 0 || y + j >= w)
          continue;

        if (s[x + i][y + j] && dict[x + i][y + j] == -1) {
          start.first = x + i;
          start.second = y + j;
          targ.push(pair<int, int>(x + i, y + j));
          dict[x + i][y + j] = num + 1;
          return true;
        }
      }
    }

    que.pop();
  }
  return false;
}

int main() {
  cin >> h >> w;
  cin >> start.first >> start.second;
  start.first--;
  start.second--;
  cin >> goal.first >> goal.second;
  goal.first--;
  goal.second--;
  s.resize(h);
  rep(i, h) s[i].resize(w);
  dict.resize(h);
  rep(i, h) dict[i].resize(w);

  rep(i, h) {
    rep(j, w) {
      char x;
      cin >> x;
      s[i][j] = (x == '.') ? true : false;
      dict[i][j] = -1;
    }
  }

  targ.push(pair<int, int>(start.first, start.second));

  int cnt = 0;
  while (1) {
    while (!targ.empty()) {
      fill(targ.front().first, targ.front().second, cnt);
      targ.pop();
    }

    if (dict[goal.first][goal.second] != -1)
      break;
    if (!search(cnt)) {
      break;
    } else {
      while (search(cnt)) {
      }
    }
    cnt++;
  }

  cout << dict[goal.first][goal.second] << endl;
}