Problem p02644 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < n; i++)
#define ll long long
using namespace std;
// typedef vector<unsigned int>vec;
// typedef vector<ll>vec;
// typedef vector<vec> mat;
typedef pair<int, int> P;
typedef pair<ll, ll> LP;
const int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
const int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};
const int INF = 1000000000;
const ll LINF = 1000000000000000000; // 1e18
const ll MOD = 1000000007;
const ll MOD2 = 998244353;
const double PI = acos(-1.0);
const double EPS = 1e-10;

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
// template<class T> inline void add(T &a, T b){a = ((a+b) % MOD + MOD) % MOD;};

void solve() {
  int H, W, K;
  cin >> H >> W >> K;
  int sh, sw, gh, gw;
  cin >> sh >> sw >> gh >> gw;
  --sh, --sw, --gh, --gw;
  vector<string> fi(H);
  REP(i, H) cin >> fi[i];

  queue<pair<int, int>> q;
  q.emplace(sh, sw);
  vector<vector<int>> dist(H, vector<int>(W, INF));
  dist[sh][sw] = 0;
  while (!q.empty()) {
    auto [h, w] = q.front();
    q.pop();
    REP(i, 4) {
      for (int l = 1; l <= K; l++) {
        int nh = h + l * dx[i], nw = w + l * dy[i];
        if (nh < 0 || nh >= H || nw < 0 || nw >= W)
          break;
        if (fi[nh][nw] == '@')
          break;
        if (dist[nh][nw] <= dist[h][w])
          break;
        if (dist[nh][nw] > dist[h][w] + 1) {
          dist[nh][nw] = dist[h][w] + 1;
          q.emplace(nh, nw);
        }
      }
    }
  }

  if (dist[gh][gw] == INF)
    dist[gh][gw] = -1;
  cout << dist[gh][gw] << endl;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  solve();
  // int T; cin >> T; REP(t,T) solve();
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < n; i++)
#define ll long long
using namespace std;
// typedef vector<unsigned int>vec;
// typedef vector<ll>vec;
// typedef vector<vec> mat;
typedef pair<int, int> P;
typedef pair<ll, ll> LP;
const int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
const int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};
const int INF = 1000000000;
const ll LINF = 1000000000000000000; // 1e18
const ll MOD = 1000000007;
const ll MOD2 = 998244353;
const double PI = acos(-1.0);
const double EPS = 1e-10;

template <class T> inline bool chmax(T &a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> inline bool chmin(T &a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
// template<class T> inline void add(T &a, T b){a = ((a+b) % MOD + MOD) % MOD;};

void solve() {
  int H, W, K;
  cin >> H >> W >> K;
  int sh, sw, gh, gw;
  cin >> sh >> sw >> gh >> gw;
  --sh, --sw, --gh, --gw;
  vector<string> fi(H);
  REP(i, H) cin >> fi[i];

  queue<pair<int, int>> q;
  q.emplace(sh, sw);
  vector<vector<int>> dist(H, vector<int>(W, INF));
  dist[sh][sw] = 0;
  while (!q.empty()) {
    auto [h, w] = q.front();
    q.pop();
    if (dist[h][w] < dist[h][w])
      continue;
    REP(i, 4) {
      for (int l = 1; l <= K; l++) {
        int nh = h + l * dx[i], nw = w + l * dy[i];
        if (nh < 0 || nh >= H || nw < 0 || nw >= W)
          break;
        if (fi[nh][nw] == '@')
          break;
        if (dist[nh][nw] <= dist[h][w])
          break;
        dist[nh][nw] = dist[h][w] + 1;
        q.emplace(nh, nw);
      }
    }
  }

  if (dist[gh][gw] == INF)
    dist[gh][gw] = -1;
  cout << dist[gh][gw] << endl;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  solve();
  // int T; cin >> T; REP(t,T) solve();
}