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

#include <bits/stdc++.h>

using namespace std;

#define INF 1000000007
#define LINF (1LL << 61)
#define PI 3.14159265358979

typedef long long i64;
typedef pair<i64, i64> P;

inline i64 mod(i64 a, i64 m) { return (a % m + m) % m; }

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;
}

i64 h, w, k, a, b, c, d;
string s[1010101];
void solve() {
  cin >> h >> w >> k;
  cin >> a >> b >> c >> d;
  a--;
  b--;
  c--;
  d--;
  for (int i = 0; i < h; i++) {
    cin >> s[i];
  }

  vector<vector<int>> v(h, vector<int>(w, INF));
  queue<pair<P, int>> q;
  q.push(make_pair(P(a, b), 0));
  v[a][b] = 0;
  int dx[4] = {0, -1, 0, 1}, dy[4] = {1, 0, -1, 0};
  while (!q.empty()) {
    auto p = q.front();
    q.pop();
    int x = p.first.first, y = p.first.second, cnt = p.second;
    if (v[x][y] != cnt)
      continue;
    if (x == c && y == d) {
      cout << cnt << endl;
      return;
    }
    for (int i = 0; i < 4; i++) {
      for (int j = 1; j <= k; j++) {
        int nx = x + dx[i] * j, ny = y + dy[i] * j;
        if (nx < 0 || ny < 0 || nx >= h || ny >= w)
          break;
        if (v[nx][ny] < cnt + 1)
          break;
        if (s[nx][ny] == '@')
          break;
        if (chmin(v[nx][ny], cnt + 1)) {
          q.push(make_pair(P(nx, ny), cnt + 1));
        }
      }
    }
  }
  cout << -1 << endl;
}

int main() {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);
  int t = 1;
  // cin >> t;
  while (t--) {
    solve();
  }

  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>

using namespace std;

#define INF 1000000007
#define LINF (1LL << 61)
#define PI 3.14159265358979

typedef long long i64;
typedef pair<i64, i64> P;

inline i64 mod(i64 a, i64 m) { return (a % m + m) % m; }

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;
}

i64 h, w, k, a, b, c, d;
string s[1010101];
void solve() {
  cin >> h >> w >> k;
  cin >> a >> b >> c >> d;
  a--;
  b--;
  c--;
  d--;
  for (int i = 0; i < h; i++) {
    cin >> s[i];
  }

  vector<vector<int>> v(h, vector<int>(w, INF));
  queue<pair<P, int>> q;
  q.push(make_pair(P(a, b), 0));
  v[a][b] = 0;
  int dx[4] = {0, -1, 0, 1}, dy[4] = {1, 0, -1, 0};
  while (!q.empty()) {
    auto p = q.front();
    q.pop();
    int x = p.first.first, y = p.first.second, cnt = p.second;
    if (v[x][y] != cnt)
      continue;
    if (x == c && y == d) {
      cout << cnt << endl;
      return;
    }
    for (int i = 0; i < 4; i++) {
      for (int j = 1; j <= k; j++) {
        int nx = x + dx[i] * j, ny = y + dy[i] * j;
        if (nx < 0 || ny < 0 || nx >= h || ny >= w)
          break;
        // if(v[nx][ny] <= cnt+1) break;
        if (s[nx][ny] == '@')
          break;
        if (chmin(v[nx][ny], cnt + 1)) {
          q.push(make_pair(P(nx, ny), cnt + 1));
        }
      }
    }
  }
  cout << -1 << endl;
}

int main() {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);
  int t = 1;
  // cin >> t;
  while (t--) {
    solve();
  }

  return 0;
}