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

#include <bits/stdc++.h>
#define For(i, a, b) for (int(i) = (int)(a); (i) < (int)(b); ++(i))
#define rFor(i, a, b) for (int(i) = (int)(a)-1; (i) >= (int)(b); --(i))
#define rep(i, n) For((i), 0, (n))
#define rrep(i, n) rFor((i), (n), 0)
#define fi first
#define se second
using namespace std;
typedef long long lint;
typedef unsigned long long ulint;
typedef pair<int, int> pii;
typedef pair<lint, lint> pll;
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> T div_floor(T a, T b) {
  if (b < 0)
    a *= -1, b *= -1;
  return a >= 0 ? a / b : (a + 1) / b - 1;
}
template <class T> T div_ceil(T a, T b) {
  if (b < 0)
    a *= -1, b *= -1;
  return a > 0 ? (a - 1) / b + 1 : a / b;
}

constexpr lint mod = 1e9 + 7;
constexpr lint INF = mod * mod;
constexpr int MAX = 200010;

int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

int main() {
  int h, w, K, sx, sy, gx, gy;
  scanf("%d%d%d%d%d%d%d", &h, &w, &K, &sx, &sy, &gx, &gy);
  --sx;
  --sy;
  --gx;
  --gy;
  char c[h][w];
  rep(i, h) rep(j, w) scanf(" %c", &c[i][j]);

  int d[h][w];
  queue<pii> que;
  rep(i, h) rep(j, w) d[i][j] = mod;
  d[sx][sy] = 0;
  que.emplace(sx, sy);
  while (!que.empty()) {
    auto [x, y] = que.front();
    que.pop();
    rep(i, 4) {
      For(k, 1, K + 1) {
        int nx = x + dx[i] * k, ny = y + dy[i] * k;
        if (nx < 0 || h <= nx || ny < 0 || w <= ny || c[nx][ny] != '.' ||
            d[nx][ny] <= d[x][y])
          break;
        if (chmin(d[nx][ny], d[x][y] + 1))
          que.emplace(nx, ny);
      }
    }
  }
  printf("%d\\n", d[gx][gy] < mod ? d[gx][gy] : -1);
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define For(i, a, b) for (int(i) = (int)(a); (i) < (int)(b); ++(i))
#define rFor(i, a, b) for (int(i) = (int)(a)-1; (i) >= (int)(b); --(i))
#define rep(i, n) For((i), 0, (n))
#define rrep(i, n) rFor((i), (n), 0)
#define fi first
#define se second
using namespace std;
typedef long long lint;
typedef unsigned long long ulint;
typedef pair<int, int> pii;
typedef pair<lint, lint> pll;
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> T div_floor(T a, T b) {
  if (b < 0)
    a *= -1, b *= -1;
  return a >= 0 ? a / b : (a + 1) / b - 1;
}
template <class T> T div_ceil(T a, T b) {
  if (b < 0)
    a *= -1, b *= -1;
  return a > 0 ? (a - 1) / b + 1 : a / b;
}

constexpr lint mod = 1e9 + 7;
constexpr lint INF = mod * mod;
constexpr int MAX = 200010;

int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

int main() {
  int h, w, K, sx, sy, gx, gy;
  scanf("%d%d%d%d%d%d%d", &h, &w, &K, &sx, &sy, &gx, &gy);
  --sx;
  --sy;
  --gx;
  --gy;
  char c[h][w];
  rep(i, h) rep(j, w) scanf(" %c", &c[i][j]);

  int d[h][w];
  queue<pii> que;
  rep(i, h) rep(j, w) d[i][j] = mod;
  d[sx][sy] = 0;
  que.emplace(sx, sy);
  while (!que.empty()) {
    auto [x, y] = que.front();
    que.pop();
    rep(i, 4) {
      For(k, 1, K + 1) {
        int nx = x + dx[i] * k, ny = y + dy[i] * k;
        if (nx < 0 || h <= nx || ny < 0 || w <= ny || c[nx][ny] != '.' ||
            d[nx][ny] <= d[x][y])
          break;
        d[nx][ny] = d[x][y] + 1;
        que.emplace(nx, ny);
      }
    }
  }
  printf("%d\\n", d[gx][gy] < mod ? d[gx][gy] : -1);
}