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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define FOR(i, a, b) for (int i = (int)a; i <= (int)b; i++)
#define DEC(i, a, b) for (int i = (int)a; i >= (int)b; i--)
typedef pair<int, int> pi;
typedef pair<int, pi> pii;
typedef pair<pi, pi> pipi;
#define f first
#define s second
typedef vector<int> vi;
typedef vector<pi> vpi;
typedef vector<pii> vpii;
#define pb push_back
#define pf push_front
#define all(v) v.begin(), v.end()
#define INF (int)1e9 + 100
#define LLINF (ll)1e18
#define fastio                                                                 \\
  ios_base::sync_with_stdio(0);                                                \\
  cin.tie(0);                                                                  \\
  cout.tie(0)

int h, w, k, sx, sy, ex, ey;
queue<pi> q;
int dx[] = {-1, 0, 0, 1}, dy[] = {0, -1, 1, 0};

int main() {
  fastio;
  cin >> h >> w >> k >> sx >> sy >> ex >> ey;
  char grid[h + 5][w + 5];
  FOR(i, 1, h) FOR(j, 1, w) cin >> grid[i][j];
  int dist[h + 5][w + 5];
  memset(dist, -1, sizeof dist);
  dist[sx][sy] = 0;
  q.push(pi(sx, sy));
  while (!q.empty()) {
    auto [x, y] = q.front();
    q.pop();
    FOR(i, 0, 3) {
      FOR(j, 1, k) {
        int nx = x + j * dx[i], ny = y + j * dy[i];
        if (nx < 1 or ny < 1 or nx > h or ny > w or grid[nx][ny] == '@')
          break;
        if (dist[nx][ny] == -1 or dist[nx][ny] >= dist[x][y] + 1) {
          if (dist[nx][ny] != dist[x][y] + 1)
            q.push(pi(nx, ny));
          dist[nx][ny] = dist[x][y] + 1;
        } else
          break;
      }
    }
  }
  cout << dist[ex][ey];
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define FOR(i, a, b) for (int i = (int)a; i <= (int)b; i++)
#define DEC(i, a, b) for (int i = (int)a; i >= (int)b; i--)
typedef pair<int, int> pi;
typedef pair<int, pi> pii;
typedef pair<pi, pi> pipi;
#define f first
#define s second
typedef vector<int> vi;
typedef vector<pi> vpi;
typedef vector<pii> vpii;
#define pb push_back
#define pf push_front
#define all(v) v.begin(), v.end()
#define INF (int)1e9 + 100
#define LLINF (ll)1e18
#define fastio                                                                 \\
  ios_base::sync_with_stdio(0);                                                \\
  cin.tie(0);                                                                  \\
  cout.tie(0)

int h, w, k, sx, sy, ex, ey;
queue<pi> q;
int dx[] = {-1, 0, 0, 1}, dy[] = {0, -1, 1, 0};

int main() {
  fastio;
  cin >> h >> w >> k >> sx >> sy >> ex >> ey;
  char grid[h + 5][w + 5];
  FOR(i, 1, h) FOR(j, 1, w) cin >> grid[i][j];
  int dist[h + 5][w + 5];
  memset(dist, -1, sizeof dist);
  dist[sx][sy] = 0;
  q.push(pi(sx, sy));
  while (!q.empty()) {
    auto [x, y] = q.front();
    q.pop();
    FOR(i, 0, 3) {
      FOR(j, 1, k) {
        int nx = x + j * dx[i], ny = y + j * dy[i];
        if (nx < 1 or ny < 1 or nx > h or ny > w or grid[nx][ny] == '@')
          break;
        if (dist[nx][ny] == -1 or dist[nx][ny] >= dist[x][y] + 1) {
          dist[nx][ny] = dist[x][y] + 1;
          q.push(pi(nx, ny));
        } else
          break;
      }
    }
  }
  cout << dist[ex][ey];
}