Problem p02644 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#ifdef __DEBUG__
#define DBG(X) cout << #X << " = " << (X) << endl;
#define SAY(X) cout << (X) << endl;
#else
#define DBG(X)
#define SAY(X)
#endif

using namespace std;

using ll = long long int;
using ull = unsigned long long int;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

int dx[] = {1, 0, -1, 0, 1, -1, 1, -1};
int dy[] = {0, 1, 0, -1, 1, 1, -1, -1};
const int INT_INF = (int)(2e9);
const ll LL_INF = (ll)(2e18);

inline void fast_io() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
};
template <typename T, typename S>
inline ostream &operator<<(ostream &os, const pair<T, S> p) {
  cout << "[" << p.first << ";" << p.second << "]";
  return os;
}
template <typename T, typename S>
inline ostream &operator<<(ostream &os, const map<T, S> p) {
  for (auto el : p)
    cout << "[" << el.first << ";" << el.second << "]";
  return os;
}
template <typename T>
inline ostream &operator<<(ostream &os, const vector<T> &v) {
  for (auto el : v)
    cout << el << " ";
  return os;
}
template <typename T>
inline ostream &operator<<(ostream &os, const deque<T> &v) {
  for (auto el : v)
    cout << el << " ";
  return os;
}
template <typename T> inline ostream &operator<<(ostream &os, const set<T> &v) {
  for (auto el : v)
    cout << el << " ";
  return os;
}
template <typename T> inline vector<T> fetch_vec(int sz) {
  vector<T> ret(sz);
  for (auto &elem : ret)
    cin >> elem;
  return ret;
}

int H, W, K;
vector<string> pond;
int sx, sy, tx, ty;
void input() {
  fast_io();
  cin >> H >> W >> K;
  cin >> sx >> sy >> tx >> ty;
  sx--, sy--;
  tx--, ty--;
  for (int i = 0; i < H; i++) {
    string s;
    cin >> s;
    pond.push_back(s);
  }
}

#define x first
#define y second

int solve() {
  queue<pair<int, pii>> q;
  q.emplace(0, make_pair(sx, sy));
  vector<vector<int>> dist(H, vector<int>(W, INT_INF));
  dist[sx][sy] = 0;
  map<pii, pii> pref;
  while (!q.empty()) {
    int d = q.front().first;
    pii cur = q.front().second;
    q.pop();
    if (dist[cur.x][cur.y] < d)
      continue;
    for (int k = 0; k < 4; k++) {
      for (int t = 1; t <= K; t++) {
        pii next = cur;
        next.x += t * dx[k];
        next.y += t * dy[k];
        if (next.x < 0 || next.x >= H)
          break;
        if (next.y < 0 || next.y >= W)
          break;
        if (pond[next.x][next.y] == '@')
          break;
        if (dist[next.x][next.y] <= dist[cur.x][cur.y])
          break;
        dist[next.x][next.y] = d + 1;
        pref[next] = cur;
        if (next.x == tx && next.y == ty)
          break;
        q.emplace(d + 1, next);
      }
    }
  }
  if (dist[tx][ty] == INT_INF) {
    cout << -1 << endl;
    return 0;
  } else
    cout << dist[tx][ty] << endl;
  return 0;
}

#undef x
#undef y

int main() {
  input();
  solve();
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
#ifdef __DEBUG__
#define DBG(X) cout << #X << " = " << (X) << endl;
#define SAY(X) cout << (X) << endl;
#else
#define DBG(X)
#define SAY(X)
#endif

using namespace std;

using ll = long long int;
using ull = unsigned long long int;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

int dx[] = {1, 0, -1, 0, 1, -1, 1, -1};
int dy[] = {0, 1, 0, -1, 1, 1, -1, -1};
const int INT_INF = (int)(2e9);
const ll LL_INF = (ll)(2e18);

inline void fast_io() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
};
template <typename T, typename S>
inline ostream &operator<<(ostream &os, const pair<T, S> p) {
  cout << "[" << p.first << ";" << p.second << "]";
  return os;
}
template <typename T, typename S>
inline ostream &operator<<(ostream &os, const map<T, S> p) {
  for (auto el : p)
    cout << "[" << el.first << ";" << el.second << "]";
  return os;
}
template <typename T>
inline ostream &operator<<(ostream &os, const vector<T> &v) {
  for (auto el : v)
    cout << el << " ";
  return os;
}
template <typename T>
inline ostream &operator<<(ostream &os, const deque<T> &v) {
  for (auto el : v)
    cout << el << " ";
  return os;
}
template <typename T> inline ostream &operator<<(ostream &os, const set<T> &v) {
  for (auto el : v)
    cout << el << " ";
  return os;
}
template <typename T> inline vector<T> fetch_vec(int sz) {
  vector<T> ret(sz);
  for (auto &elem : ret)
    cin >> elem;
  return ret;
}

int H, W, K;
vector<string> pond;
int sx, sy, tx, ty;
void input() {
  fast_io();
  cin >> H >> W >> K;
  cin >> sx >> sy >> tx >> ty;
  sx--, sy--;
  tx--, ty--;
  for (int i = 0; i < H; i++) {
    string s;
    cin >> s;
    pond.push_back(s);
  }
}

#define x first
#define y second

int solve() {
  queue<pair<int, pii>> q;
  q.emplace(0, make_pair(sx, sy));
  vector<vector<int>> dist(H, vector<int>(W, INT_INF));
  dist[sx][sy] = 0;
  map<pii, pii> pref;
  while (!q.empty()) {
    int d = q.front().first;
    pii cur = q.front().second;
    q.pop();
    if (dist[cur.x][cur.y] < d)
      continue;
    for (int k = 0; k < 4; k++) {
      for (int t = 1; t <= K; t++) {
        pii next = cur;
        next.x += t * dx[k];
        next.y += t * dy[k];
        if (next.x < 0 || next.x >= H)
          break;
        if (next.y < 0 || next.y >= W)
          break;
        if (pond[next.x][next.y] == '@')
          break;
        if (dist[next.x][next.y] <= dist[cur.x][cur.y])
          break;
        if (dist[next.x][next.y] <= d + 1)
          continue;
        dist[next.x][next.y] = d + 1;
        pref[next] = cur;
        if (next.x == tx && next.y == ty)
          break;
        q.emplace(d + 1, next);
      }
    }
  }
  if (dist[tx][ty] == INT_INF) {
    cout << -1 << endl;
    return 0;
  } else
    cout << dist[tx][ty] << endl;
  return 0;
}

#undef x
#undef y

int main() {
  input();
  solve();
  return 0;
}