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

#pragma region Headers
#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cwchar>
#include <cwctype>

// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <codecvt>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <type_traits>
#include <typeindex>
#include <unordered_map>
#include <unordered_set>
#endif
#pragma endregion

using namespace std;
#pragma region Macros
#define CHOOSE(a) CHOOSE2 a
#define CHOOSE2(a0, a1, a2, a3, a4, x, ...) x
#define debug_1(x1) cout << #x1 << ": " << x1 << endl
#define debug_2(x1, x2)                                                        \\
  cout << #x1 << ": " << x1 << ", " #x2 << ": " << x2 << endl
#define debug_3(x1, x2, x3)                                                    \\
  cout << #x1 << ": " << x1 << ", " #x2 << ": " << x2 << ", " #x3 << ": "      \\
       << x3 << endl
#define debug_4(x1, x2, x3, x4)                                                \\
  cout << #x1 << ": " << x1 << ", " #x2 << ": " << x2 << ", " #x3 << ": "      \\
       << x3 << ", " #x4 << ": " << x4 << endl
#define debug_5(x1, x2, x3, x4, x5)                                            \\
  cout << #x1 << ": " << x1 << ", " #x2 << ": " << x2 << ", " #x3 << ": "      \\
       << x3 << ", " #x4 << ": " << x4 << ", " #x5 << ": " << x5 << endl
#ifdef _DEBUG
#define debug(...)                                                             \\
  CHOOSE((__VA_ARGS__, debug_5, debug_4, debug_3, debug_2, debug_1, ~))        \\
  (__VA_ARGS__)
#else
#define debug(...)
#endif
#pragma region end

#pragma region Libraries
template <typename T> string to_string(T o) {
  stringstream s;
  s << o;
  return s.str();
}

template <typename T> string to_string(vector<T> v) {
  stringstream s;
  s << "[";
  for (auto i = 0; i < v.size(); i++) {
    s << to_string(v.at(i));
    if (i != v.size() - 1) {
      s << ", ";
    }
  }
  s << "]";
  return s.str();
}

template <typename T> ostream &operator<<(ostream &o, const vector<T> &obj) {
  o << to_string(obj);
  return o;
}

template <typename T> string to_string(vector<vector<T>> m) {
  stringstream s;
  s << "[" << endl;
  for (auto i = 0; i < m.size(); i++) {
    auto v = m[i];
    s << "  "
      << "#" << i << ":"
      << " " << to_string(v);
    s << ", " << endl;
  }
  s << "]";
  return s.str();
}

template <typename T>
ostream &operator<<(ostream &o, const vector<vector<T>> &obj) {
  o << to_string(obj);
  return o;
}

template <typename K, typename V> string to_string(pair<K, V> p) {
  stringstream s;
  s << "pair(" << to_string(p.first) << ", " << to_string(p.second) << ")";
  return s.str();
}

template <typename K, typename V>
ostream &operator<<(ostream &o, const pair<K, V> &obj) {
  o << to_string(obj);
  return o;
}

template <typename K, typename V> string to_string(map<K, V> m) {
  stringstream s;
  s << "{" << endl;
  for (const auto &p : m) {
    s << "  " << to_string(p.first) << ": " << to_string(p.second) << ","
      << endl;
  }
  s << "}";
  return s.str();
}

template <typename K, typename V>
ostream &operator<<(ostream &o, const map<K, V> &obj) {
  o << to_string(obj);
  return o;
}

template <typename T> string to_string(set<T> ss) {
  stringstream s;
  s << "set"
    << "{";
  for (auto itr = ss.begin(); itr != ss.end(); itr++) {
    s << to_string(*itr);
    if (next(itr, 1) != ss.end()) {
      s << ", ";
    }
  }
  s << "}";
  return s.str();
}

template <typename T> ostream &operator<<(ostream &o, const set<T> &obj) {
  o << to_string(obj);
  return o;
}

template <typename T> string to_string(queue<T> q) {
  auto temp = queue<T>{};
  stringstream s;
  s << "queue{";
  while (!q.empty()) {
    auto top = q.front();
    s << to_string(top) << ", ";
    q.pop();
    temp.push(top);
  }
  s << "}";

  while (!temp.empty()) {
    auto top = temp.front();
    temp.pop();
    q.push(top);
  }

  return s.str();
}

template <typename T> ostream &operator<<(ostream &o, const queue<T> &obj) {
  o << to_string(obj);
  return o;
}
#pragma endregion

typedef long long ll;

int main() {
  cin.tie(0);
  ll H, W;
  char M[1001][1001];
  ll CH, CW, DH, DW;

  cin >> H >> W;
  cin >> CH >> CW;
  cin >> DH >> DW;
  const int initial = 9999999;
  vector<vector<int>> costs(H, vector<int>(W, initial));

  CH--;
  CW--;
  DH--;
  DW--;

  for (auto i = 0; i < H; i++) {
    for (auto j = 0; j < W; j++) {
      char w;
      cin >> w;
      M[i][j] = w;
    }
  }

  // 壁の中にいたら困る
  if (M[CH][CW] == '#') {
    throw runtime_error("in the wall");
  }
  // 自分のマスから他のマスにジャンプできるか.
  queue<pair<ll, ll>> q;
  q.push(make_pair(CH, CW));

  vector<ll> move_h = {0, 1, -1, 0};
  vector<ll> move_w = {1, 0, 0, -1};

  costs[CH][CW] = 0;

  while (costs[DH][DW] == initial && !q.empty()) {
    auto p = q.front();
    q.pop();

    queue<pair<ll, ll>> qq;
    qq.push(p);
    set<pair<ll, ll>> visited_at_cycle;
    visited_at_cycle.insert(p);

    while (!qq.empty()) {
      auto pp = qq.front();
      qq.pop();
      int cur_cost = costs[pp.first][pp.second];

      for (auto i = 0; i < 4; i++) {
        auto hh = move_h[i];
        auto ww = move_w[i];

        ll hhh = pp.first + hh;
        ll www = pp.second + ww;

        if (hhh >= 0 && www >= 0 && hhh < H && www < W) {
          if (M[hhh][www] == '.') {
            int next_cost = costs[hhh][www];
            auto next_pair = make_pair(hhh, www);
            if ((visited_at_cycle.count(next_pair) == 0)) {
              debug(next_pair, min(costs[hhh][www], costs[p.first][p.second]));
              costs[hhh][www] = min(next_cost, cur_cost);
              qq.push(next_pair);
              visited_at_cycle.insert(next_pair);
            }
          }
        }
      }
    }

    for (auto pp : visited_at_cycle) {
      debug("jump", pp);
      int cur_cost = costs[pp.first][pp.second];
      for (auto i = -2; i <= 2; i++) {
        for (auto j = -2; j <= 2; j++) {
          ll hhh = pp.first + i;
          ll www = pp.second + j;

          if (hhh >= 0 && www >= 0 && hhh < H && www < W) {
            if (M[hhh][www] == '.') {
              int next_cost = costs[hhh][www];
              if (next_cost == initial || next_cost > cur_cost + 1) {
                debug(make_pair(hhh, www), min(cur_cost + 1, next_cost));
                costs[hhh][www] = min(cur_cost + 1, next_cost);
                q.push(make_pair(hhh, www));
              }
            }
          }
        }
      }
    }
  }

  if (costs[DH][DW] == initial) {
    cout << -1 << endl;
  } else {
    cout << costs[DH][DW] << endl;
  }

  debug(costs);

  return 0;
}


Error: TLE

Fixed submission:

#pragma region Headers
#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cwchar>
#include <cwctype>

// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>

#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <codecvt>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <type_traits>
#include <typeindex>
#include <unordered_map>
#include <unordered_set>
#endif
#pragma endregion

using namespace std;
#pragma region Macros
#define CHOOSE(a) CHOOSE2 a
#define CHOOSE2(a0, a1, a2, a3, a4, x, ...) x
#define debug_1(x1) cout << #x1 << ": " << x1 << endl
#define debug_2(x1, x2)                                                        \\
  cout << #x1 << ": " << x1 << ", " #x2 << ": " << x2 << endl
#define debug_3(x1, x2, x3)                                                    \\
  cout << #x1 << ": " << x1 << ", " #x2 << ": " << x2 << ", " #x3 << ": "      \\
       << x3 << endl
#define debug_4(x1, x2, x3, x4)                                                \\
  cout << #x1 << ": " << x1 << ", " #x2 << ": " << x2 << ", " #x3 << ": "      \\
       << x3 << ", " #x4 << ": " << x4 << endl
#define debug_5(x1, x2, x3, x4, x5)                                            \\
  cout << #x1 << ": " << x1 << ", " #x2 << ": " << x2 << ", " #x3 << ": "      \\
       << x3 << ", " #x4 << ": " << x4 << ", " #x5 << ": " << x5 << endl
#ifdef _DEBUG
#define debug(...)                                                             \\
  CHOOSE((__VA_ARGS__, debug_5, debug_4, debug_3, debug_2, debug_1, ~))        \\
  (__VA_ARGS__)
#else
#define debug(...)
#endif
#pragma region end

#pragma region Libraries
template <typename T> string to_string(T o) {
  stringstream s;
  s << o;
  return s.str();
}

template <typename T> string to_string(vector<T> v) {
  stringstream s;
  s << "[";
  for (auto i = 0; i < v.size(); i++) {
    s << to_string(v.at(i));
    if (i != v.size() - 1) {
      s << ", ";
    }
  }
  s << "]";
  return s.str();
}

template <typename T> ostream &operator<<(ostream &o, const vector<T> &obj) {
  o << to_string(obj);
  return o;
}

template <typename T> string to_string(vector<vector<T>> m) {
  stringstream s;
  s << "[" << endl;
  for (auto i = 0; i < m.size(); i++) {
    auto v = m[i];
    s << "  "
      << "#" << i << ":"
      << " " << to_string(v);
    s << ", " << endl;
  }
  s << "]";
  return s.str();
}

template <typename T>
ostream &operator<<(ostream &o, const vector<vector<T>> &obj) {
  o << to_string(obj);
  return o;
}

template <typename K, typename V> string to_string(pair<K, V> p) {
  stringstream s;
  s << "pair(" << to_string(p.first) << ", " << to_string(p.second) << ")";
  return s.str();
}

template <typename K, typename V>
ostream &operator<<(ostream &o, const pair<K, V> &obj) {
  o << to_string(obj);
  return o;
}

template <typename K, typename V> string to_string(map<K, V> m) {
  stringstream s;
  s << "{" << endl;
  for (const auto &p : m) {
    s << "  " << to_string(p.first) << ": " << to_string(p.second) << ","
      << endl;
  }
  s << "}";
  return s.str();
}

template <typename K, typename V>
ostream &operator<<(ostream &o, const map<K, V> &obj) {
  o << to_string(obj);
  return o;
}

template <typename T> string to_string(set<T> ss) {
  stringstream s;
  s << "set"
    << "{";
  for (auto itr = ss.begin(); itr != ss.end(); itr++) {
    s << to_string(*itr);
    if (next(itr, 1) != ss.end()) {
      s << ", ";
    }
  }
  s << "}";
  return s.str();
}

template <typename T> ostream &operator<<(ostream &o, const set<T> &obj) {
  o << to_string(obj);
  return o;
}

template <typename T> string to_string(queue<T> q) {
  auto temp = queue<T>{};
  stringstream s;
  s << "queue{";
  while (!q.empty()) {
    auto top = q.front();
    s << to_string(top) << ", ";
    q.pop();
    temp.push(top);
  }
  s << "}";

  while (!temp.empty()) {
    auto top = temp.front();
    temp.pop();
    q.push(top);
  }

  return s.str();
}

template <typename T> ostream &operator<<(ostream &o, const queue<T> &obj) {
  o << to_string(obj);
  return o;
}
#pragma endregion

typedef long long ll;

int main() {
  cin.tie(0);
  ll H, W;
  char M[1001][1001];
  ll CH, CW, DH, DW;

  cin >> H >> W;
  cin >> CH >> CW;
  cin >> DH >> DW;

  vector<vector<int>> costs(H, vector<int>(W, -1));

  CH--;
  CW--;
  DH--;
  DW--;

  for (auto i = 0; i < H; i++) {
    for (auto j = 0; j < W; j++) {
      char w;
      cin >> w;
      M[i][j] = w;
    }
  }

  // 壁の中にいたら困る
  if (M[CH][CW] == '#') {
    throw runtime_error("in the wall");
  }
  // 自分のマスから他のマスにジャンプできるか.
  queue<pair<ll, ll>> q;
  q.push(make_pair(CH, CW));

  vector<ll> move_h = {0, 1, -1, 0};
  vector<ll> move_w = {1, 0, 0, -1};

  costs[CH][CW] = 0;

  while (costs[DH][DW] == -1 && !q.empty()) {
    auto p = q.front();
    q.pop();

    int cur_cost = costs[p.first][p.second];
    for (auto hh : move_h) {
      for (auto ww : move_w) {
        ll hhh = p.first + hh;
        ll www = p.second + ww;

        if (hhh >= 0 && www >= 0 && hhh < H && www < W) {
          if (M[hhh][www] == '.') {
            ll next_cost = costs[hhh][www];
            if (next_cost == -1 || next_cost > cur_cost) {
              costs[hhh][www] = min(costs[hhh][www], costs[p.first][p.second]);
              q.push(make_pair(hhh, www));
            }
          }
        }
      }
    }

    for (auto i = -2; i <= 2; i++) {
      for (auto j = -2; j <= 2; j++) {
        ll hhh = p.first + i;
        ll www = p.second + j;

        if (hhh >= 0 && www >= 0 && hhh < H && www < W) {
          if (M[hhh][www] == '.') {
            ll next_cost = costs[hhh][www];
            if (next_cost == -1 || next_cost > cur_cost + 1) {
              costs[hhh][www] = min(cur_cost + 1, costs[hhh][www]);
              q.push(make_pair(hhh, www));
            }
          }
        }
      }
    }
  }

  cout << costs[DH][DW] << endl;
  // debug(costs);

  return 0;
}