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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;
#define fi first
#define se second
#define ALL(x) (x).begin(), (x).end()
#define RALL(x) (x).rbegin(), (x).rend()
#define eb emplace_back
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define SZ(x) (int)(x).size()
#define endl '\\n'
#define FOR(a, b, c) for (auto a = (b); (a) < (c); ++(a))
#define F0R(a, b) FOR(a, 0, (b))
#define CEIL(a, b) ((a) + (b)-1) / (b)
template <class T> bool ckmin(T &a, const T &b) {
  return a > b ? a = b, true : false;
}
template <class T> bool ckmax(T &a, const T &b) {
  return a < b ? a = b, true : false;
}
#ifndef DEBUG
#define DEBUG 0
#endif
#define dout                                                                   \\
  if (DEBUG)                                                                   \\
  std::cerr
#define dvar(...) " [" << #__VA_ARGS__ ": " << mt(__VA_ARGS__) << "] "
template <typename T> struct IsC {
  template <typename C> static char test(typename C::const_iterator *);
  template <typename C> static int test(...);
  static const bool value = sizeof(test<T>(0)) == sizeof(char);
};
template <> struct IsC<string> {
  static const bool value = false;
};
template <typename C>
typename enable_if<IsC<C>::value, ostream &>::type operator<<(ostream &,
                                                              const C &);
template <typename T1, typename T2>
ostream &operator<<(ostream &, const pair<T1, T2> &);
template <typename... T> using TS = tuple_size<tuple<T...>>;
template <size_t idx, typename... T>
typename enable_if<TS<T...>::value == idx + 1, ostream &>::type
operator<<(ostream &o, const tuple<T...> &t) {
  return o << ", " << get<idx>(t) << ')';
}
template <size_t idx, typename... T>
typename enable_if<0 < idx && idx + 1 < TS<T...>::value, ostream &>::type
operator<<(ostream &o, const tuple<T...> &t) {
  return operator<< <idx + 1>(o << ", " << get<idx>(t), t);
}
template <size_t idx = 0, typename... T>
typename enable_if<1 < TS<T...>::value && !idx, ostream &>::type
operator<<(ostream &o, const tuple<T...> &t) {
  return operator<< <idx + 1>(o << '(' << get<idx>(t), t);
}
template <typename T> ostream &operator<<(ostream &o, const tuple<T> &t) {
  return o << get<0>(t);
}
template <typename T1, typename T2>
ostream &operator<<(ostream &o, const pair<T1, T2> &p) {
  return o << mt(p.fi, p.se);
}
template <typename C>
typename enable_if<IsC<C>::value, ostream &>::type operator<<(ostream &o,
                                                              const C &c) {
  o << '[';
  for (auto it = c.cbegin(); it != c.cend(); ++it)
    o << *it << (next(it) != c.cend() ? ", " : "");
  return o << ']';
}
template <typename T>
void tprint(vector<vector<T>> &v, size_t width = 0, ostream &o = cerr) {
  if (!DEBUG)
    return;
  for (const auto &vv : v) {
    for (const auto &i : vv)
      o << setw(width) << i;
    o << endl;
  }
}

array<int, 3> a;

void solve() {
  int h, w, fromR, fromC, toR, toC;
  cin >> h >> w >> fromR >> fromC >> toR >> toC;
  fromR--;
  fromC--;
  toR--;
  toC--;

  vector<vector<bool>> a(h, vector<bool>(w)), seen(h, vector<bool>(w)),
      walk(h, vector<bool>(w));

  F0R(r, h) F0R(c, w) {
    char ch;
    cin >> ch;
    a[r][c] = ch == '.';
  }

  set<array<int, 3>> q;
  array<int, 3> tmp;
  tmp[0] = 0;
  tmp[1] = fromR;
  tmp[2] = fromC;
  q.insert(tmp);
  while (SZ(q)) {

    array<int, 3> x = *q.begin();
    int cnt = x[0];
    int r = x[1];
    int c = x[2];
    q.erase(q.begin());
    seen[r][c] = true;

    if (r == toR && c == toC) {
      cout << cnt << endl;
      return;
    }

    FOR(dr, -2, 3) FOR(dc, -2, 3) {
      if (!dr && !dc)
        continue;
      int rr = r + dr;
      int cc = c + dc;

      if (min(rr, cc) < 0 || rr >= h || cc >= w || seen[rr][cc] || !a[rr][cc])
        continue;

      array<int, 3> y;
      if ((abs(dr) == 1 && !abs(dc)) || (abs(dc) == 1 && !abs(dr))) {
        y[0] = cnt;
      } else {
        y[0] = cnt + 1;
      }
      y[1] = rr;
      y[2] = cc;
      q.insert(y);
    }
  }

  cout << -1 << endl;
}

int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);

  int tc = 1;
  FOR(i, 1, tc + 1) {
    // cout << "Case #" << i << ": ";
    solve();
  }
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<vi> vvi;
typedef vector<vii> vvii;
#define fi first
#define se second
#define ALL(x) (x).begin(), (x).end()
#define RALL(x) (x).rbegin(), (x).rend()
#define eb emplace_back
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define SZ(x) (int)(x).size()
#define endl '\\n'
#define FOR(a, b, c) for (auto a = (b); (a) < (c); ++(a))
#define F0R(a, b) FOR(a, 0, (b))
#define CEIL(a, b) ((a) + (b)-1) / (b)
template <class T> bool ckmin(T &a, const T &b) {
  return a > b ? a = b, true : false;
}
template <class T> bool ckmax(T &a, const T &b) {
  return a < b ? a = b, true : false;
}
#ifndef DEBUG
#define DEBUG 0
#endif
#define dout                                                                   \\
  if (DEBUG)                                                                   \\
  std::cerr
#define dvar(...) " [" << #__VA_ARGS__ ": " << mt(__VA_ARGS__) << "] "
template <typename T> struct IsC {
  template <typename C> static char test(typename C::const_iterator *);
  template <typename C> static int test(...);
  static const bool value = sizeof(test<T>(0)) == sizeof(char);
};
template <> struct IsC<string> {
  static const bool value = false;
};
template <typename C>
typename enable_if<IsC<C>::value, ostream &>::type operator<<(ostream &,
                                                              const C &);
template <typename T1, typename T2>
ostream &operator<<(ostream &, const pair<T1, T2> &);
template <typename... T> using TS = tuple_size<tuple<T...>>;
template <size_t idx, typename... T>
typename enable_if<TS<T...>::value == idx + 1, ostream &>::type
operator<<(ostream &o, const tuple<T...> &t) {
  return o << ", " << get<idx>(t) << ')';
}
template <size_t idx, typename... T>
typename enable_if<0 < idx && idx + 1 < TS<T...>::value, ostream &>::type
operator<<(ostream &o, const tuple<T...> &t) {
  return operator<< <idx + 1>(o << ", " << get<idx>(t), t);
}
template <size_t idx = 0, typename... T>
typename enable_if<1 < TS<T...>::value && !idx, ostream &>::type
operator<<(ostream &o, const tuple<T...> &t) {
  return operator<< <idx + 1>(o << '(' << get<idx>(t), t);
}
template <typename T> ostream &operator<<(ostream &o, const tuple<T> &t) {
  return o << get<0>(t);
}
template <typename T1, typename T2>
ostream &operator<<(ostream &o, const pair<T1, T2> &p) {
  return o << mt(p.fi, p.se);
}
template <typename C>
typename enable_if<IsC<C>::value, ostream &>::type operator<<(ostream &o,
                                                              const C &c) {
  o << '[';
  for (auto it = c.cbegin(); it != c.cend(); ++it)
    o << *it << (next(it) != c.cend() ? ", " : "");
  return o << ']';
}
template <typename T>
void tprint(vector<vector<T>> &v, size_t width = 0, ostream &o = cerr) {
  if (!DEBUG)
    return;
  for (const auto &vv : v) {
    for (const auto &i : vv)
      o << setw(width) << i;
    o << endl;
  }
}

void solve() {
  int h, w, fromR, fromC, toR, toC;
  cin >> h >> w >> fromR >> fromC >> toR >> toC;
  fromR--;
  fromC--;
  toR--;
  toC--;

  vector<vector<bool>> a(h, vector<bool>(w)), seen(h, vector<bool>(w)),
      walk(h, vector<bool>(w));

  F0R(r, h) F0R(c, w) {
    char ch;
    cin >> ch;
    a[r][c] = ch == '.';
  }

  tprint(a);

  queue<ii> q;
  q.emplace(fromR, fromC);
  int cnt = 0;
  vii next;
  do {
    next.clear();

    while (SZ(q)) {
      auto [r, c] = q.front();
      q.pop();
      if (r == toR && c == toC) {
        cout << cnt << endl;
        return;
      }
      FOR(dr, -2, 3) FOR(dc, -2, 3) {
        if (!dr && !dc)
          continue;
        int rr = r + dr;
        int cc = c + dc;

        if (min(rr, cc) < 0 || rr >= h || cc >= w || walk[rr][cc] || !a[rr][cc])
          continue;

        seen[rr][cc] = true;

        if ((abs(dr) == 1 && !abs(dc)) || (abs(dc) == 1 && !abs(dr))) {
          dout << "Walking" << dvar(rr, cc) << endl;
          walk[rr][cc] = true;
          q.emplace(rr, cc);
        } else {
          next.eb(rr, cc);
        }
      }
    }

    tprint(walk);
    for (auto [r, c] : next)
      if (!walk[r][c])
        q.emplace(r, c);
    cnt++;
  } while (SZ(q));

  cout << -1 << endl;
}

int main() {
  cin.tie(0);
  ios_base::sync_with_stdio(0);

  int tc = 1;
  FOR(i, 1, tc + 1) {
    // cout << "Case #" << i << ": ";
    solve();
  }
}