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

#include <bits/stdc++.h>
#define FASTIO                                                                 \\
  ios::sync_with_stdio(false);                                                 \\
  cin.tie(NULL);                                                               \\
  cout.tie(NULL);
#define LL long long int
using namespace std;

const int N = 2e5 + 5;
const int oo = 1e9;

int movex[4] = {-1, 1, 0, 0};
int movey[4] = {0, 0, -1, 1};

void solve() {
  int h, w, k;
  cin >> h >> w >> k;
  vector<string> v(h);
  int x1, y1, x2, y2;
  cin >> x1 >> y1 >> x2 >> y2;
  x1--;
  y1--;
  x2--;
  y2--;
  for (auto &it : v)
    cin >> it;
  vector<vector<int>> reach(h, vector<int>(w, oo));
  queue<pair<int, int>> bfs;
  bfs.push({x1, y1});
  reach[x1][y1] = 0;
  while (!bfs.empty()) {
    auto now = bfs.front();
    bfs.pop();
    int xx = now.first, yy = now.second;
    for (int move = 0; move < 4; ++move) {
      for (int d = 1; d <= k; ++d) {
        int x = xx + movex[move] * d;
        int y = yy + movey[move] * d;
        if (x < 0 || x >= h || y < 0 || y >= w)
          break;
        if (v[x][y] != '.')
          break;
        if (reach[x][y] < reach[xx][yy] + 1)
          break;

        if (reach[x][y] > reach[xx][yy] + 1)
          bfs.push({x, y});
        reach[x][y] = min(reach[xx][yy] + 1, reach[x][y]);
      }
    }
  }
  int ans = reach[x2][y2];
  if (ans >= oo)
    ans = -1;
  cout << ans << '\\n';
}
int main() {
  // FASTIO;
  int t = 1;
  // cin >> t;
  while (t--)
    solve();
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define FASTIO                                                                 \\
  ios::sync_with_stdio(false);                                                 \\
  cin.tie(NULL);                                                               \\
  cout.tie(NULL);
#define LL long long int
using namespace std;

const int N = 2e5 + 5;
const int oo = 1e9;

int movex[4] = {-1, 1, 0, 0};
int movey[4] = {0, 0, -1, 1};

void solve() {
  int h, w, k;
  cin >> h >> w >> k;
  vector<string> v(h);
  int x1, y1, x2, y2;
  cin >> x1 >> y1 >> x2 >> y2;
  x1--;
  y1--;
  x2--;
  y2--;
  for (auto &it : v)
    cin >> it;
  vector<vector<int>> reach[4];
  for (int i = 0; i < 4; ++i)
    reach[i].resize(h, vector<int>(w, oo));

  for (int i = 0; i < 4; ++i)
    reach[i][x1][y1] = 0;
  deque<array<int, 3>> bfs;
  for (int i = 0; i < 4; ++i)
    bfs.push_front({x1, y1, i});
  while (!bfs.empty()) {
    auto now = bfs.front();
    bfs.pop_front();
    int xx = now[0], yy = now[1], dir = now[2];

    for (int move = 0; move < 4; ++move) {
      if (reach[move][xx][yy] > reach[dir][xx][yy]) {
        reach[move][xx][yy] = reach[dir][xx][yy];
        bfs.push_front({xx, yy, move});
      }
    }

    vector<array<int, 3>> pushme;
    for (int move = dir; move <= dir; ++move) {
      for (int d = 1; d <= k; ++d) {
        int x = xx + movex[move] * d;
        int y = yy + movey[move] * d;
        if (x < 0 || x >= h || y < 0 || y >= w)
          break;
        if (v[x][y] != '.')
          break;
        if (reach[dir][xx][yy] + 1 <= reach[move][x][y]) {
          pushme.push_back({x, y, move});
          reach[move][x][y] = reach[dir][xx][yy] + 1;
        } else {
          break;
        }
      }
    }
    if (!pushme.empty()) {
      reverse(pushme.begin(), pushme.end());
      for (auto it : pushme)
        bfs.push_back(it);
    }
  }
  int ans = oo;
  for (int i = 0; i < 4; ++i)
    if (reach[i][x2][y2] < ans)
      ans = reach[i][x2][y2];
  if (ans >= oo)
    ans = -1;
  cout << ans << '\\n';
}
int main() {
  FASTIO;
  int t = 1;
  // cin >> t;
  while (t--)
    solve();
  return 0;
}