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

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define rep(i, a, b) for (int i = (a); i < (b); i++)
#define repi(i, a, b) for (int i = (a); i > (b); i--)
#define db(x) (cerr << #x << ": " << (x) << '\\n')
#define sync ios_base::sync_with_stdio(false), cin.tie(NULL)
#define cps CLOCKS_PER_SEC
#define tests(t)                                                               \\
  int t;                                                                       \\
  cin >> t;                                                                    \\
  while (t--)
#define iceil(n, x) (((n) + (x)-1) / (x))
#define ll long long
#define gcd __gcd
#define eb emplace_back
#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define sz size()
#define all(v) (v).begin(), (v).end()
#define uni(v) sort(all(v)), (v).erase(unique(all(v)), (v).end())
#define pii pair<int, int>
#define vi vector<int>
#define vpii vector<pii>
#define vvi vector<vi>
#define fi first
#define se second
#define mt make_tuple
#define pqueue priority_queue
#define bitcount(x) __builtin_popcount(x)
#define PI acos(-1.0)
#define EPS 1e-9
#define mod 1000000007
using namespace std;

#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1> void __f(const char *name, Arg1 &&arg1) {
  cerr << name << " : " << arg1 << '\\n';
}
template <typename Arg1, typename... Args>
void __f(const char *names, Arg1 &&arg1, Args &&...args) {
  const char *comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << '(' << p.fi << ", " << p.se << ')';
}

template <typename T> void printv(const T &v) {
  for (auto i : v)
    cerr << i << ' ';
  cerr << '\\n';
}

template <typename T> using minpq = priority_queue<T, vector<T>, greater<T>>;

template <typename T> using maxpq = priority_queue<T>;

// All indexing is 0-based
using namespace __gnu_pbds;
template <class key, class cmp = std::less<key>>
using ordered_set =
    tree<key, null_type, cmp, rb_tree_tag, tree_order_statistics_node_update>;
// methods: find_by_order(k); & order_of_key(k);
// To make it an ordered_multiset, use pairs of (value, time_of_insertion)
// to distinguish values which are similar

template <class key, class value, class cmp = std::less<key>>
using ordered_map =
    tree<key, value, cmp, rb_tree_tag, tree_order_statistics_node_update>;

// Returns no. of values x for which ceil(n / x) == y (y must be > 1).
inline ll CC(ll n, ll y) { return iceil(n, y - 1) - iceil(n, y); }

// Returns no. of values x for which floor(n / x) == y
inline ll FF(ll n, ll y) { return n / y - n / (y + 1); }

// a and b are assumed to be taken modulo p
inline int add(int a, int b, int p = mod) {
  int c = a + b;
  if (c >= p)
    c -= p;
  return c;
}
inline int sub(int a, int b, int p = mod) {
  int c = a - b;
  if (c < 0)
    c += p;
  return c;
}
inline int mul(int a, int b, int p = mod) { return (a * 1ll * b) % p; }

#define N 100005
#define int ll
// #define trace(...) 42

const int inf = 1e9;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, 1, -1};

int n, m, k;
vector<string> grid;
vector<vector<int>> dis;

inline bool isValid(int i, int j) {
  return i >= 0 && j >= 0 && i < n && j < m && grid[i][j] == '.';
}

int bfs(int x1, int y1, int x2, int y2) {
  queue<int> q;
  q.push(x1);
  q.push(y1);
  q.push(dis[x1][y1] = 0);

  while (q.size()) {
    int i = q.front();
    q.pop();
    int j = q.front();
    q.pop();
    int d = q.front();
    q.pop();
    // trace(i, j, d);

    if (i == x2 && j == y2)
      return d;

    for (int dir = 0; dir < 4; dir++) {
      int x = i, y = j;
      for (int o = 0; o < k; o++) {
        x += dx[dir], y += dy[dir];
        if (!isValid(x, y))
          break;
        if (dis[x][y] <= d)
          break;
        if (dis[x][y] > d + 1) {
          dis[x][y] = d + 1;
          q.push(x);
          q.push(y);
          q.push(d + 1);
        }
      }
    }
  }

  return -1;
}

int32_t main() {
#ifdef CP
  freopen("/home/tarun/Desktop/input.txt", "r", stdin);
  // freopen("/home/tarun/Desktop/output.txt", "w", stdout);
#endif
  sync;
  clock_t clk = clock();
  cerr << "I will return...\\n";

  cin >> n >> m >> k;
  int x1, y1, x2, y2;
  cin >> x1 >> y1 >> x2 >> y2;
  --x1, --y1, --x2, --y2;

  grid.resize(n);
  for (string &s : grid)
    cin >> s;
  dis.assign(n, vector<int>(m, inf));

  cout << bfs(x1, y1, x2, y2) << '\\n';

  cerr << "...don't you ever hang your head.\\n";
  cerr << "Time (in ms): " << (double)(clock() - clk) * 1000.0 / cps << '\\n';
}

// Compile using:
// g++ -o filename.exe --std=c++11 filename.cpp
// Use -D CP for defining a macro CP in the local environment


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define rep(i, a, b) for (int i = (a); i < (b); i++)
#define repi(i, a, b) for (int i = (a); i > (b); i--)
#define db(x) (cerr << #x << ": " << (x) << '\\n')
#define sync ios_base::sync_with_stdio(false), cin.tie(NULL)
#define cps CLOCKS_PER_SEC
#define tests(t)                                                               \\
  int t;                                                                       \\
  cin >> t;                                                                    \\
  while (t--)
#define iceil(n, x) (((n) + (x)-1) / (x))
#define ll long long
#define gcd __gcd
#define eb emplace_back
#define pb push_back
#define pf push_front
#define pob pop_back
#define pof pop_front
#define sz size()
#define all(v) (v).begin(), (v).end()
#define uni(v) sort(all(v)), (v).erase(unique(all(v)), (v).end())
#define pii pair<int, int>
#define vi vector<int>
#define vpii vector<pii>
#define vvi vector<vi>
#define fi first
#define se second
#define mt make_tuple
#define pqueue priority_queue
#define bitcount(x) __builtin_popcount(x)
#define PI acos(-1.0)
#define EPS 1e-9
#define mod 1000000007
using namespace std;

#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1> void __f(const char *name, Arg1 &&arg1) {
  cerr << name << " : " << arg1 << '\\n';
}
template <typename Arg1, typename... Args>
void __f(const char *names, Arg1 &&arg1, Args &&...args) {
  const char *comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  return os << '(' << p.fi << ", " << p.se << ')';
}

template <typename T> void printv(const T &v) {
  for (auto i : v)
    cerr << i << ' ';
  cerr << '\\n';
}

template <typename T> using minpq = priority_queue<T, vector<T>, greater<T>>;

template <typename T> using maxpq = priority_queue<T>;

// All indexing is 0-based
using namespace __gnu_pbds;
template <class key, class cmp = std::less<key>>
using ordered_set =
    tree<key, null_type, cmp, rb_tree_tag, tree_order_statistics_node_update>;
// methods: find_by_order(k); & order_of_key(k);
// To make it an ordered_multiset, use pairs of (value, time_of_insertion)
// to distinguish values which are similar

template <class key, class value, class cmp = std::less<key>>
using ordered_map =
    tree<key, value, cmp, rb_tree_tag, tree_order_statistics_node_update>;

// Returns no. of values x for which ceil(n / x) == y (y must be > 1).
inline ll CC(ll n, ll y) { return iceil(n, y - 1) - iceil(n, y); }

// Returns no. of values x for which floor(n / x) == y
inline ll FF(ll n, ll y) { return n / y - n / (y + 1); }

// a and b are assumed to be taken modulo p
inline int add(int a, int b, int p = mod) {
  int c = a + b;
  if (c >= p)
    c -= p;
  return c;
}
inline int sub(int a, int b, int p = mod) {
  int c = a - b;
  if (c < 0)
    c += p;
  return c;
}
inline int mul(int a, int b, int p = mod) { return (a * 1ll * b) % p; }

#define N 100005
#define int ll
// #define trace(...) 42

const int inf = 1e9;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, 1, -1};

int n, m, k;
vector<string> grid;
vector<vector<int>> dis;

inline bool isValid(int i, int j) {
  return i >= 0 && j >= 0 && i < n && j < m && grid[i][j] == '.';
}

int bfs(int x1, int y1, int x2, int y2) {
  queue<int> q;
  q.push(x1);
  q.push(y1);
  q.push(dis[x1][y1] = 0);

  while (q.size()) {
    int i = q.front();
    q.pop();
    int j = q.front();
    q.pop();
    int d = q.front();
    q.pop();

    if (i == x2 && j == y2)
      return d;

    for (int dir = 0; dir < 4; dir++) {
      int x = i, y = j;
      for (int o = 0; o < k; o++) {
        x += dx[dir], y += dy[dir];
        if (!isValid(x, y))
          break;
        if (dis[x][y] > d + 1) {
          dis[x][y] = d + 1;
          q.push(x);
          q.push(y);
          q.push(d + 1);
        }
      }
    }
  }

  return -1;
}

int32_t main() {
#ifdef CP
  freopen("/home/tarun/Desktop/input.txt", "r", stdin);
  // freopen("/home/tarun/Desktop/output.txt", "w", stdout);
#endif
  sync;
  clock_t clk = clock();
  cerr << "I will return...\\n";

  cin >> n >> m >> k;
  int x1, y1, x2, y2;
  cin >> x1 >> y1 >> x2 >> y2;
  --x1, --y1, --x2, --y2;

  grid.resize(n);
  for (string &s : grid)
    cin >> s;

  dis.assign(n, vector<int>(m, inf));

  cout << bfs(x1, y1, x2, y2) << '\\n';

  cerr << "...don't you ever hang your head.\\n";
  cerr << "Time (in ms): " << (double)(clock() - clk) * 1000.0 / cps << '\\n';
}

// Compile using:
// g++ -o filename.exe --std=c++11 filename.cpp
// Use -D CP for defining a macro CP in the local environment