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

#include "bits/stdc++.h"

using namespace std;

typedef long double ld;
typedef long long ll;

#define sz(x) (int)(x).size()
#define pb push_back
#define mp make_pair
#define f first
#define s second

const int INF = 3e8;

int h, w, k;
pair<int, int> s, e;
vector<int> dx = {1, -1, 0, 0}, dy = {0, 0, -1, 1};
vector<vector<char>> b;
vector<vector<int>> d;
bool chk(pair<int, int> pos) {
  return pos.f >= 0 && pos.f < h && pos.s >= 0 && pos.s < w;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> h >> w >> k >> s.f >> s.s >> e.f >> e.s;
  s.f--;
  e.f--;
  s.s--;
  e.s--;
  b.assign(h, vector<char>(w, ' '));
  d.assign(h, vector<int>(w, INF));
  for (int i = 0; i < h; ++i)
    for (int j = 0; j < w; ++j)
      cin >> b[i][j];
  queue<pair<int, int>> q;
  q.push(s);
  d[s.f][s.s] = 0;
  while (!q.empty()) {
    pair<int, int> c = q.front();
    q.pop();
    for (int dir = 0; dir < 4; ++dir) {
      for (int i = 1; i <= k; ++i) {
        pair<int, int> cc = {c.f + dx[dir] * i, c.s + dy[dir] * i};
        if (!chk(cc))
          break;
        if (b[cc.f][cc.s] == '@')
          break;
        if (d[cc.f][cc.s] != INF) {
          if (d[cc.f][cc.s] == d[c.f][c.s] + 1)
            continue;
          else
            break;
        }
        d[cc.f][cc.s] = d[c.f][c.s] + 1;
        q.push(cc);
      }
    }
  }
  cout << (d[e.f][e.s] == INF ? -1 : d[e.f][e.s]);
  return 0;
}

Error: WA

Fixed submission:

#pragma GCC optimize("O3")
#include "bits/stdc++.h"

using namespace std;

typedef long double ld;
typedef long long ll;

#define sz(x) (int)(x).size()
#define pb push_back
#define mp make_pair
#define f first
#define s second

const int INF = 3e8;
int h, w, k;
pair<int, int> st, nd;
vector<vector<char>> b;
vector<vector<int>> d;
vector<vector<vector<bool>>> vis;
queue<pair<pair<int, int>, int>> q;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> h >> w >> k;
  cin >> st.f >> st.s >> nd.f >> nd.s;
  st.f--;
  st.s--;
  nd.f--;
  nd.s--;
  b.assign(h, vector<char>(w, ' '));
  d.assign(h, vector<int>(w, INF));
  vis.assign(h, vector<vector<bool>>(w, vector<bool>(2, 0)));
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; ++j) {
      cin >> b[i][j];
    }
  }
  q.push({{st.f, st.s}, 0});
  q.push({{st.f, st.s}, 1});
  d[st.f][st.s] = 0;
  vis[st.f][st.s][0] = vis[st.f][st.s][1] = true;
  while (!q.empty()) {
    pair<pair<int, int>, int> c = q.front();
    q.pop();
    if (c.f == nd) {
      // for(auto i : d){
      //     for(auto j : i){
      //         if(j == INF) cout << 'I' << "\\t";
      //         else cout << j << "\\t";
      //     }
      //     cout << "\\n";
      // }
      cout << d[c.f.f][c.f.s];
      return 0;
    }
    if (!c.s) {
      int ls = c.f.f;
      for (int i = c.f.f + 1; i <= min(c.f.f + k, h - 1); ++i) {
        if (b[i][c.f.s] == '@')
          break;
        if (vis[i][c.f.s][0])
          break;
        if (!vis[i][c.f.s][1]) {
          vis[i][c.f.s][1] = true;
          d[i][c.f.s] = min(d[c.f.f][c.f.s] + 1, d[i][c.f.s]);
          q.push({{i, c.f.s}, 1});
        }
        ls = i;
      }
      if (ls != c.f.f && !vis[ls][c.f.s][0]) {
        vis[ls][c.f.s][0] = true;
        d[ls][c.f.f] = min(d[c.f.f][c.f.s] + 1, d[ls][c.f.f]);
        q.push({{ls, c.f.s}, 0});
      }
      ls = c.f.f;
      for (int i = c.f.f - 1; i >= max(c.f.f - k, 0); --i) {
        if (b[i][c.f.s] == '@')
          break;
        if (vis[i][c.f.s][0])
          break;
        if (!vis[i][c.f.s][1]) {
          vis[i][c.f.s][1] = true;
          d[i][c.f.s] = min(d[c.f.f][c.f.s] + 1, d[i][c.f.s]);
          q.push({{i, c.f.s}, 1});
        }
        ls = i;
      }
      if (ls != c.f.f && !vis[ls][c.f.s][0]) {
        vis[ls][c.f.s][0] = true;
        d[ls][c.f.f] = min(d[c.f.f][c.f.s] + 1, d[ls][c.f.f]);
        q.push({{ls, c.f.s}, 0});
      }
    } else {
      int ls = c.f.s;
      for (int i = c.f.s + 1; i <= min(c.f.s + k, w - 1); ++i) {
        if (b[c.f.f][i] == '@')
          break;
        if (vis[c.f.f][i][1])
          break;
        if (!vis[c.f.f][i][0]) {
          vis[c.f.f][i][0] = true;
          d[c.f.f][i] = min(d[c.f.f][c.f.s] + 1, d[c.f.f][i]);
          q.push({{c.f.f, i}, 0});
        }
        ls = i;
      }
      if (ls != c.f.s && !vis[c.f.f][ls][1]) {
        vis[c.f.f][ls][1] = true;
        d[c.f.f][ls] = min(d[c.f.f][c.f.s] + 1, d[c.f.f][ls]);
        q.push({{c.f.f, ls}, 1});
      }
      ls = c.f.s;
      for (int i = c.f.s - 1; i >= max(c.f.s - k, 0); --i) {
        if (b[c.f.f][i] == '@')
          break;
        if (vis[c.f.f][i][1])
          break;
        if (!vis[c.f.f][i][0]) {
          vis[c.f.f][i][0] = true;
          d[c.f.f][i] = min(d[c.f.f][c.f.s] + 1, d[c.f.f][i]);
          q.push({{c.f.f, i}, 0});
        }
        ls = i;
      }
      if (ls != c.f.s && !vis[c.f.f][ls][1]) {
        vis[c.f.f][ls][1] = true;
        d[c.f.f][ls] = min(d[c.f.f][c.f.s] + 1, d[c.f.f][ls]);
        q.push({{c.f.f, ls}, 1});
      }
    }
  }
  // for(auto i : d){
  //     for(auto j : i){
  //         if(j == INF) cout << 'I' << "\\t";
  //         else cout << j << "\\t";
  //     }
  //     cout << "\\n";
  // }
  cout << -1;
  return 0;
}