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

#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i < b; i++)
#define rrep(i, a, b) for (int i = a; i >= b; i--)
#define fore(i, a) for (auto &i : a)
#define all(x) (x).begin(), (x).end()
// #pragma GCC optimize ("-O3")
using namespace std;
void _main();
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  _main();
}
typedef long long ll;
const int inf = INT_MAX / 2;
const ll infl = 1LL << 60;
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
//---------------------------------------------------------------------------------------------------
/*---------------------------------------------------------------------------------------------------
　　　　　　　　　　　 ∧＿∧
　　　　　 ∧＿∧ 　（´<_｀ ）　 Welcome to My Coding Space!
　　　　 （ ´_ゝ`）　/　 ⌒i     @hamayanhamayan0
　　　　／　　　＼　 　  |　|
　　　 /　　 /￣￣￣￣/　　|
　 ＿_(__ﾆつ/　    ＿/ .| .|＿＿＿＿
　 　　　＼/＿＿＿＿/　（u　⊃
---------------------------------------------------------------------------------------------------*/

int H, W, K, sx, sy, tx, ty;
string c[1010101];
int mi[1010101];
int dx[4] = {0, 1, 0, -1}, dy[4] = {-1, 0, 1, 0};
//---------------------------------------------------------------------------------------------------
void _main() {
  cin >> H >> W >> K >> sx >> sy >> tx >> ty;
  rep(y, 0, H) cin >> c[y];
  sx--;
  sy--;
  tx--;
  ty--;

  queue<int> que;
  rep(i, 0, 1010101) mi[i] = inf;

  que.push(sx * W + sy);
  mi[sx * W + sy] = 0;

  while (!que.empty()) {
    int q = que.front();
    que.pop();

    int x = q / W;
    int y = q % W;

    if (x == tx && y == ty) {
      printf("%d\\n", mi[q]);
      return;
    }

    rep(d, 0, 4) {
      int xx = x, yy = y;
      rep(k, 0, K) {
        xx += dx[d];
        yy += dy[d];

        if (xx < 0 || H <= xx || yy < 0 || W <= yy)
          break;
        if (c[xx][yy] == '@')
          break;

        int id = xx * W + yy;
        if (mi[id] <= mi[q])
          break;
        if (mi[q] + 1 < mi[id]) {
          mi[id] = mi[q] + 1;
          que.push(id);
        }
      }
    }
  }

  printf("-1\\n");
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i < b; i++)
#define rrep(i, a, b) for (int i = a; i >= b; i--)
#define fore(i, a) for (auto &i : a)
#define all(x) (x).begin(), (x).end()
// #pragma GCC optimize ("-O3")
using namespace std;
void _main();
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  _main();
}
typedef long long ll;
const int inf = INT_MAX / 2;
const ll infl = 1LL << 60;
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
//---------------------------------------------------------------------------------------------------
/*---------------------------------------------------------------------------------------------------
　　　　　　　　　　　 ∧＿∧
　　　　　 ∧＿∧ 　（´<_｀ ）　 Welcome to My Coding Space!
　　　　 （ ´_ゝ`）　/　 ⌒i     @hamayanhamayan0
　　　　／　　　＼　 　  |　|
　　　 /　　 /￣￣￣￣/　　|
　 ＿_(__ﾆつ/　    ＿/ .| .|＿＿＿＿
　 　　　＼/＿＿＿＿/　（u　⊃
---------------------------------------------------------------------------------------------------*/

int H, W, K, sx, sy, tx, ty;
string c[1010101];
int mi[1010101];
bool vis[1010101];
int dx[4] = {0, 1, 0, -1}, dy[4] = {-1, 0, 1, 0};
//---------------------------------------------------------------------------------------------------
void _main() {
  cin >> H >> W >> K >> sx >> sy >> tx >> ty;
  rep(y, 0, H) cin >> c[y];
  sx--;
  sy--;
  tx--;
  ty--;

  queue<int> que;
  rep(i, 0, 1010101) mi[i] = inf;

  que.push(sx * W + sy);
  mi[sx * W + sy] = 0;
  vis[sx * W + sy] = true;

  while (!que.empty()) {
    int q = que.front();
    que.pop();

    int x = q / W;
    int y = q % W;

    if (x == tx && y == ty) {
      printf("%d\\n", mi[q]);
      return;
    }

    rep(d, 0, 4) {
      int xx = x, yy = y;
      rep(k, 0, K) {
        xx += dx[d];
        yy += dy[d];

        if (xx < 0 || H <= xx || yy < 0 || W <= yy)
          break;
        if (c[xx][yy] == '@')
          break;

        int id = xx * W + yy;
        if (mi[id] <= mi[q])
          break;

        vis[id] = true;
        mi[id] = mi[q] + 1;
        que.push(id);
      }
    }
  }

  printf("-1\\n");
}