Problem p02644 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
/*#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,
tree_order_statistics_node_update>;*/
#define itn int
#define all(c) c.begin(), c.end()
#define make_unique(x)                                                         \
  sort(all((x)));                                                              \
  (x).resize(unique(all((x))) - (x).begin())
#define ll long long
#define ull unsigned long long
#define pll pair<ll, ll>
#define pii pair<int, int>
#define mp(x, y) make_pair(x, y)
using namespace std;

const double PI = 3.1415926536;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

template <typename T> ostream &operator<<(ostream &out, const vector<T> &mas) {
  for (const auto &x : mas) {
    out << x << ' ';
  }
  return out;
}

void ok() { cout << "YES" << '\n'; }

void no() { cout << "NO" << '\n'; }

inline ll nxt() {
  ll x;
  cin >> x;
  return x;
}

int xx[] = {1, -1, 0, 0};
int yy[] = {0, 0, 1, -1};

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr), cout.tie(nullptr);
  int n = nxt(), m = nxt(), k = nxt();
  int x1 = nxt() - 1, y1 = nxt() - 1;
  int x2 = nxt() - 1, y2 = nxt() - 1;
  vector<vector<char>> matr(n, vector<char>(m));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> matr[i][j];
    }
  }
  auto is_in = [&](int x, int y) {
    return (x >= 0 && x <= n - 1 && y >= 0 && y <= m - 1);
  };

  auto bfs = [&]() {
    queue<pii> q;
    vector<vector<int>> d(n, vector<int>(m, INT_MAX));
    if (matr[x1][y1] != '@') {
      q.push({x1, y1});
      d[x1][y1] = 0;
    }

    while (!q.empty()) {

      pii from = q.front();
      int cur = d[from.first][from.second];
      q.pop();

      for (int i = 0; i < 4; i++) {
        int x = from.first;
        int y = from.second;
        for (int j = 0; j < k; j++) {
          x += xx[i];
          y += yy[i];
          if (!is_in(x, y))
            break;
          if (matr[x][y] == '@') {
            break;
          }
          if (cur + 1 > d[x][y]) {
            break;
          }
          d[x][y] = cur + 1;
          q.push({x, y});
        }
      }
    }
    return d[x2][y2];
  };

  int rez = bfs();
  if (rez == INT_MAX)
    rez = -1;
  cout << rez;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
/*#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,
tree_order_statistics_node_update>;*/
#define itn int
#define all(c) c.begin(), c.end()
#define make_unique(x)                                                         \
  sort(all((x)));                                                              \
  (x).resize(unique(all((x))) - (x).begin())
#define ll long long
#define ull unsigned long long
#define pll pair<ll, ll>
#define pii pair<int, int>
#define mp(x, y) make_pair(x, y)
using namespace std;

const double PI = 3.1415926536;
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

template <typename T> ostream &operator<<(ostream &out, const vector<T> &mas) {
  for (const auto &x : mas) {
    out << x << ' ';
  }
  return out;
}

void ok() { cout << "YES" << '\n'; }

void no() { cout << "NO" << '\n'; }

inline ll nxt() {
  ll x;
  cin >> x;
  return x;
}

int xx[] = {1, -1, 0, 0};
int yy[] = {0, 0, 1, -1};

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr), cout.tie(nullptr);
  int n = nxt(), m = nxt(), k = nxt();
  int x1 = nxt() - 1, y1 = nxt() - 1;
  int x2 = nxt() - 1, y2 = nxt() - 1;
  vector<vector<char>> matr(n, vector<char>(m));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      cin >> matr[i][j];
    }
  }
  auto is_in = [&](int x, int y) {
    return (x >= 0 && x <= n - 1 && y >= 0 && y <= m - 1);
  };

  auto bfs = [&]() {
    queue<pii> q;
    vector<vector<int>> d(n, vector<int>(m, INT_MAX));
    if (matr[x1][y1] != '@') {
      q.push({x1, y1});
      d[x1][y1] = 0;
    }

    while (!q.empty()) {

      pii from = q.front();
      int cur = d[from.first][from.second];
      q.pop();

      for (int i = 0; i < 4; i++) {
        int x = from.first;
        int y = from.second;
        for (int j = 0; j < k; j++) {
          x += xx[i];
          y += yy[i];
          if (!is_in(x, y))
            break;
          if (matr[x][y] == '@') {
            break;
          }
          if (cur + 1 > d[x][y]) {
            break;
          }
          if (cur + 1 >= d[x][y]) {
            continue;
          }
          d[x][y] = cur + 1;
          q.push({x, y});
        }
      }
    }
    return d[x2][y2];
  };

  int rez = bfs();
  if (rez == INT_MAX)
    rez = -1;
  cout << rez;
  return 0;
}