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

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
  // 標準入力高速化のおまじない
  // scanfとの同期を切る。以降紛らわしいのでscanf使用不可。
  ios::sync_with_stdio(false);
  // // cin前の自動flashをやめる
  cin.tie(nullptr);

  int map_height, map_width, amount_of_movement;
  cin >> map_height >> map_width >> amount_of_movement;

  int sx, sy, gx, gy;
  cin >> sx >> sy >> gx >> gy;
  sx--, sy--, gx--, gy--;

  const int INF = 2e9;
  // 最短でその座標に到達できる手数を記録していく(TODO: 初期値検討)
  vector<vector<int>> vec_map(map_height, vector<int>(map_width, INF));

  // mapを取得 string=char[]なのでcharの2次元配列と同じ意味
  vector<string> str_map(map_height);
  for (int i = 0; i < map_height; i++) {
    cin >> str_map[i];
  }

  vec_map[sx][sy] = 0;
  // sp = starting point 次に調べる起点座標
  queue<pair<int, int>> sp_que;
  sp_que.push(make_pair(sx, sy));

  vector<int> direction_x = {1, -1, 0, 0};
  vector<int> direction_y = {0, 0, 1, -1};
  int move_count = 0;
  while (!sp_que.empty()) {
    pair<int, int> p = sp_que.front();
    int x = p.first, y = p.second;
    sp_que.pop();
    move_count = vec_map[x][y] + 1;

    // 動ける範囲は上下左右の４方向
    for (int i = 0; i < 4; i++) {
      int try_x = x, try_y = y;
      for (int m = 1; m <= amount_of_movement; m++) {
        try_x += direction_x[i];
        try_y += direction_y[i];

        // マップ外に出ようとしたら打ち切り
        if (try_x < 0 || try_x >= map_height || try_y < 0 || try_y >= map_width)
          break;

        // 通行止めなら打ち切り
        if (str_map[try_x][try_y] == '@')
          break;

        // 遠回りしていることがわかったら打ち切り
        if (vec_map[try_x][try_y] < move_count)
          break;
        if (vec_map[try_x][try_y] == move_count)
          continue;

        vec_map[try_x][try_y] = move_count;
        sp_que.push(make_pair(try_x, try_y));
      }
    }
  }

  int result = vec_map[gx][gy];
  if (result == INF)
    result = -1;
  cout << result << endl;
  return 0;
}

Error: 1

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
  // 標準入力高速化のおまじない
  // scanfとの同期を切る。以降紛らわしいのでscanf使用不可。
  ios::sync_with_stdio(false);
  // // cin前の自動flashをやめる
  cin.tie(nullptr);

  int map_height, map_width, amount_of_movement;
  cin >> map_height >> map_width >> amount_of_movement;

  int sx, sy, gx, gy;
  cin >> sx >> sy >> gx >> gy;
  sx--, sy--, gx--, gy--;

  const int INF = 2e9;
  // 最短でその座標に到達できる手数を記録していく(TODO: 初期値検討)
  vector<vector<int>> vec_map(map_height, vector<int>(map_width, INF));

  // mapを取得 string=char[]なのでcharの2次元配列と同じ意味
  vector<string> str_map(map_height);
  for (int i = 0; i < map_height; i++) {
    cin >> str_map[i];
  }

  vec_map[sx][sy] = 0;
  // sp = starting point 次に調べる起点座標
  queue<pair<int, int>> sp_que;
  sp_que.push(make_pair(sx, sy));

  vector<int> direction_x = {1, -1, 0, 0};
  vector<int> direction_y = {0, 0, 1, -1};
  int move_count = 0;
  while (!sp_que.empty()) {
    pair<int, int> p = sp_que.front();
    int x = p.first, y = p.second;
    sp_que.pop();
    move_count = vec_map[x][y] + 1;

    // 動ける範囲は上下左右の４方向
    for (int i = 0; i < 4; i++) {
      int try_x = x, try_y = y;
      for (int m = 1; m <= amount_of_movement; m++) {
        try_x += direction_x[i];
        try_y += direction_y[i];

        // マップ外に出ようとしたら打ち切り
        if (try_x < 0 || try_x >= map_height || try_y < 0 || try_y >= map_width)
          break;

        // 通行止めなら打ち切り
        if (str_map[try_x][try_y] == '@')
          break;

        // 遠回りしていることがわかったら打ち切り
        if (vec_map[try_x][try_y] < move_count)
          break;

        vec_map[try_x][try_y] = move_count;
        sp_que.push(make_pair(try_x, try_y));
      }
    }
  }

  int result = vec_map[gx][gy];
  if (result == INF)
    result = -1;
  cout << result << endl;
  return 1;
}