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

#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
using namespace std;

#include <climits>
#include <iomanip>
#include <math.h>
#include <queue>
#include <vector>
using Graph = vector<vector<int>>;
const double PI = 3.14159265358979323846;
#define int long long

signed main() {

  int H, W, Ch, Cw, Dh, Dw;
  char S[2000][2000];
  int kaisu[2000][2000];
  queue<pair<int, int>> mk, kk;
  // mk(未開拓)kk(既開拓)

  pair<int, int> tmp;

  cin >> H >> W >> Ch >> Cw >> Dh >> Dw;
  for (int i = 0; i < 2000; i++) {
    for (int j = 0; j < 2000; j++) {
      kaisu[i][j] = -2;
    }
  }
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cin >> S[i + 1][j + 1];
      kaisu[i + 1][j + 1] = -1;
    }
  }
  for (int i = 0; i < H + 1; i++) {
    S[i][0] = '#';
    S[i][W + 1] = '#';
  }
  for (int j = 0; j < W + 1; j++) {
    S[0][j] = '#';
    S[H + 1][j] = '#';
  }

  mk.push(make_pair(Ch, Cw));
  kaisu[Ch][Cw] = 0;

  int count = 0;
  for (int sasakama = 0; sasakama < H * W * 5; sasakama++) {
    if (mk.size() != 0) {
      tmp = mk.front();
      int h = tmp.first;
      int w = tmp.second;
      if (S[h + 1][w] == '.' && kaisu[h + 1][w] == -1) {
        mk.push(make_pair(h + 1, w));
        kaisu[h + 1][w] = count;
      }
      if (S[h - 1][w] == '.' && kaisu[h - 1][w] == -1) {
        mk.push(make_pair(h - 1, w));
        kaisu[h - 1][w] = count;
      }
      if (S[h][w + 1] == '.' && kaisu[h][w + 1] == -1) {
        mk.push(make_pair(h, w + 1));
        kaisu[h][w + 1] = count;
      }
      if (S[h][w - 1] == '.' && kaisu[h][w - 1] == -1) {
        mk.push(make_pair(h, w - 1));
        kaisu[h][w - 1] = count;
      }
      kk.push(tmp);
      if (h == Dh && w == Dw) {
        break;
      }
      mk.pop();
    } else if (kk.size() != 0) {
      count++;
      int kurikaeshi = kk.size();
      for (int i = 0; i < kurikaeshi; i++) {
        tmp = kk.front();
        int h = tmp.first;
        int w = tmp.second;
        for (int j = -2; j < 3; j++) {
          for (int k = -2; k < 3; k++) {
            if (h + j >= 1 && h + j <= H && w + k >= 1 && w + k <= W) {
              if (S[h + j][w + k] == '.' && kaisu[h + j][w + k] == -1) {
                mk.push(make_pair(h + j, w + k));
                kaisu[h + j][w + k] = count;
              }
            }
          }
        }
        kk.pop();
      }
    }
    if (sasakama == H * W * 5 - 1) {
      count = -1;
      break;
    }
  }

  cout << count << endl;

  cin >> count;

  return 0;
}


Error: -11

Fixed submission:

#include <algorithm>
#include <functional>
#include <iostream>
#include <string>
using namespace std;

#include <climits>
#include <iomanip>
#include <math.h>
#include <queue>
#include <vector>
using Graph = vector<vector<int>>;
const double PI = 3.14159265358979323846;
#define int long long

signed main() {

  int H, W, Ch, Cw, Dh, Dw;
  char S[20000][20000];
  int kaisu[20000][20000];
  queue<pair<int, int>> mk, kk;
  // mk(未開拓)kk(既開拓)

  pair<int, int> tmp;

  cin >> H >> W >> Ch >> Cw >> Dh >> Dw;
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cin >> S[i + 1][j + 1];
      kaisu[i + 1][j + 1] = -1;
    }
  }
  for (int i = 0; i < H + 1; i++) {
    S[i][0] = '#';
    S[i][W + 1] = '#';
  }
  for (int j = 0; j < W + 1; j++) {
    S[0][j] = '#';
    S[H + 1][j] = '#';
  }

  if (S[Ch][Cw - 1] == '#' && S[Ch][Cw + 1] == '#' && S[Ch - 1][Cw] == '#' &&
      S[Ch + 1][Cw] == '#') {
    kk.push(make_pair(Ch, Cw));
  } else {
    mk.push(make_pair(Ch, Cw));
  }
  kaisu[Ch][Cw] = 0;

  int count = 0;
  for (int sasakama = 0; sasakama < H * W * 5; sasakama++) {
    if (mk.size() != 0) {
      tmp = mk.front();
      int h = tmp.first;
      int w = tmp.second;
      if (S[h + 1][w] == '.' && kaisu[h + 1][w] == -1) {
        mk.push(make_pair(h + 1, w));
        kaisu[h + 1][w] = count;
      }
      if (S[h - 1][w] == '.' && kaisu[h - 1][w] == -1) {
        mk.push(make_pair(h - 1, w));
        kaisu[h - 1][w] = count;
      }
      if (S[h][w + 1] == '.' && kaisu[h][w + 1] == -1) {
        mk.push(make_pair(h, w + 1));
        kaisu[h][w + 1] = count;
      }
      if (S[h][w - 1] == '.' && kaisu[h][w - 1] == -1) {
        mk.push(make_pair(h, w - 1));
        kaisu[h][w - 1] = count;
      }
      kk.push(tmp);
      if (h == Dh && w == Dw) {
        break;
      }
      mk.pop();
    } else if (kk.size() != 0) {
      count++;
      for (int i = 0; i < kk.size(); i++) {
        tmp = kk.front();
        int h = tmp.first;
        int w = tmp.second;
        for (int j = -2; j < 3; j++) {
          for (int k = -2; k < 3; k++) {
            if (h + j >= 1 && h + j <= H && w + k >= 1 && w + k <= W) {
              if (S[h + j][w + k] == '.' && kaisu[h + j][w + k] == -1) {
                mk.push(make_pair(h + j, w + k));
                kaisu[h + j][w + k] = count;
              }
            }
          }
        }
        kk.pop();
      }
    }
    if (sasakama == H * W * 5 - 1) {
      count = -1;
      break;
    }
  }

  cout << count << endl;

  cin >> count;

  return 0;
}