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

#include <algorithm>
#include <iostream>
#include <numeric>
#include <string>
#include <tuple>
#include <utility>
#include <vector>

#define REP(i, a, b) for (int i = int(a); i < int(b); i++)
using namespace std;
using ll = long long int;
using P = pair<ll, ll>;

// clang-format off
#ifdef _DEBUG_
#define dump(...) do{ cerr << __LINE__ << ":\\t" << #__VA_ARGS__ << " = "; PPPPP(__VA_ARGS__); cerr << endl; } while(false)
template<typename T> void PPPPP(T t) { cerr << t; }
template<typename T, typename... S> void PPPPP(T t, S... s) { cerr << t << ", "; PPPPP(s...); }
#else
#define dump(...) do{ } while(false)
#endif
template<typename T> vector<T> make_v(size_t a, T b) { return vector<T>(a, b); }
template<typename... Ts> auto make_v(size_t a, Ts... ts) { return vector<decltype(make_v(ts...))>(a, make_v(ts...)); }
template<typename T> bool chmin(T &a, T b) { if (a > b) {a = b; return true; } return false; }
template<typename T> bool chmax(T &a, T b) { if (a < b) {a = b; return true; } return false; }
template<typename T> void print(T a) { cout << a << endl; }
template<typename T, typename... Ts> void print(T a, Ts... ts) { cout << a << ' '; print(ts...); }
template<typename T> istream &operator,(istream &in, T &t) { return in >> t; }
// clang-format on

#include <deque>

using T = tuple<ll, int, int>;

int main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  int h, w;
  cin, h, w;
  int sx, sy, gx, gy;
  cin, sy, sx, gy, gx;
  sx--;
  sy--;
  gx--;
  gy--;
  auto mp = make_v(h, w, '#');
  REP(i, 0, h) {
    REP(j, 0, w) { cin, mp[i][j]; }
  }

  deque<T> q;
  q.emplace_front(0LL, sx, sy);
  const int inf = 1 << 29;
  auto cost = make_v(h, w, inf);
  int ans = -1;
  while (q.size()) {
    auto [c, x, y] = q.front();
    q.pop_front();
    if (x == gx && y == gy) {
      ans = c;
      break;
    }
    if (cost[y][x] < c)
      continue;
    cost[y][x] = c;
    REP(dx, -2, 3) {
      REP(dy, -2, 3) {
        if (dx == 0 && dy == 0)
          continue;
        int nc = 1;
        if (dx * dy == 0 && abs(dx + dy) == 1) {
          nc = 0;
        }
        int nx = x + dx;
        int ny = y + dy;
        if (0 <= nx && nx < w && 0 <= ny && ny < h && mp[ny][nx] == '.' &&
            cost[ny][nx] > c + nc) {
          if (nc == 0) {
            q.emplace_front(c, nx, ny);
          } else {
            q.emplace_back(c + nc, nx, ny);
          }
        }
      }
    }
  }
  print(ans);

  return 0;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <iostream>
#include <numeric>
#include <string>
#include <tuple>
#include <utility>
#include <vector>

#define REP(i, a, b) for (int i = int(a); i < int(b); i++)
using namespace std;
using ll = long long int;
using P = pair<ll, ll>;

// clang-format off
#ifdef _DEBUG_
#define dump(...) do{ cerr << __LINE__ << ":\\t" << #__VA_ARGS__ << " = "; PPPPP(__VA_ARGS__); cerr << endl; } while(false)
template<typename T> void PPPPP(T t) { cerr << t; }
template<typename T, typename... S> void PPPPP(T t, S... s) { cerr << t << ", "; PPPPP(s...); }
#else
#define dump(...) do{ } while(false)
#endif
template<typename T> vector<T> make_v(size_t a, T b) { return vector<T>(a, b); }
template<typename... Ts> auto make_v(size_t a, Ts... ts) { return vector<decltype(make_v(ts...))>(a, make_v(ts...)); }
template<typename T> bool chmin(T &a, T b) { if (a > b) {a = b; return true; } return false; }
template<typename T> bool chmax(T &a, T b) { if (a < b) {a = b; return true; } return false; }
template<typename T> void print(T a) { cout << a << endl; }
template<typename T, typename... Ts> void print(T a, Ts... ts) { cout << a << ' '; print(ts...); }
template<typename T> istream &operator,(istream &in, T &t) { return in >> t; }
// clang-format on

#include <queue>

using T = tuple<ll, int, int>;

int main() {
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  int h, w;
  cin, h, w;
  int sx, sy, gx, gy;
  cin, sy, sx, gy, gx;
  sx--;
  sy--;
  gx--;
  gy--;
  auto mp = make_v(h, w, '#');
  REP(i, 0, h) {
    REP(j, 0, w) { cin, mp[i][j]; }
  }

  priority_queue<T, vector<T>, greater<T>> q;
  q.emplace(0, sx, sy);
  const int inf = 1 << 29;
  auto cost = make_v(h, w, inf);
  int ans = -1;
  while (q.size()) {
    auto [c, x, y] = q.top();
    q.pop();
    if (x == gx && y == gy) {
      ans = c;
      break;
    }
    if (cost[y][x] < c)
      continue;
    cost[y][x] = c;
    REP(dx, -2, 3) {
      REP(dy, -2, 3) {
        if (dx == 0 && dy == 0)
          continue;
        int nc = 1;
        if (dx * dy == 0 && abs(dx + dy) == 1) {
          nc = 0;
        }
        int nx = x + dx;
        int ny = y + dy;
        if (0 <= nx && nx < w && 0 <= ny && ny < h && mp[ny][nx] == '.' &&
            cost[ny][nx] > c + nc) {
          q.emplace(c + nc, nx, ny);
        }
      }
    }
  }
  print(ans);

  return 0;
}