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

#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rep2(i, x, n) for (int i = x; i < (n); i++)
#define all(n) begin(n), end(n)
struct cww {
  cww() {
    ios::sync_with_stdio(false);
    cin.tie(0);
  }
} star;
const long long INF = numeric_limits<long long>::max();
using ll = long long;
// 座標 corrdinate と深さを保持するための構造体
struct Corr {
  ll y;
  ll x;
  ll depth;
};

int main() {
  int H, W;
  cin >> H >> W;
  int Ch, Cw, Dh, Dw;
  cin >> Ch >> Cw >> Dh >> Dw;
  vector<string> S(H);
  rep(i, H) { cin >> S[i]; }
  vector<vector<ll>> maps(H, vector<ll>(W, INF));

  maps[Ch - 1][Cw - 1] = 0; // スタートは0回
  // 0回ワープで行けるマスを全て洗い出す、
  // それらのマスから1回ワープして行けるマスのうちまだ行けてないマスを全て洗い出す
  // ワープは最大でも1000回
  deque<pair<int, int>> que;
  que.push_front(make_pair(Ch - 1, Cw - 1));
  int dy[4] = {0, 0, 1, -1}; // dx,dy は次の探索場所への距離を表す（４方向分）
  int dx[4] = {1, -1, 0, 0};
  int dwy[20] = {
      1, 1, -1, -1, 2,  2,  2,  2,  2, 1, 1,
      0, 0, -1, -1, -2, -2, -2, -2, -2}; // dwx,dwy
                                         // は次の探索場所への距離を表す（ワープ分）
  int dwx[20] = {1, -1, -1, 1,  -2, -1, 0,  1, 2, -2,
                 2, -2, 2,  -2, 2,  -2, -1, 0, 1, 2};
  while (que.size() != 0) { // キューの要素がなくなったら終了
    pair<int, int> now = que.front(); // 現在の状態
    que.pop_front();

    for (int i = 0; i < 4; i++) {
      int ny = now.first + dy[i];  // 次の探索場所の行番号
      int nx = now.second + dx[i]; // 次の探索場所の列番号
      if (ny < 0 || H <= ny || nx < 0 || W <= nx)
        continue; // 迷路の外に出るならスルー
      if (S[ny][nx] == '#')
        continue; // 障害物があればスルー
      if (maps[ny][nx] <= maps[now.first][now.second])
        continue; // それ以前に探索済みならスルー
      que.push_front(make_pair(ny, nx));
      maps[ny][nx] = maps[now.first][now.second];
    }
    for (int k = 0; k < 20; k++) {
      int nwy = now.first + dwy[k];
      int nwx = now.second + dwx[k];
      if (nwy < 0 || H <= nwy || nwx < 0 || W <= nwx)
        continue; // 迷路の外に出るならスルー
      if (S[nwy][nwx] == '#')
        continue; // 障害物があればスルー
      if (maps[nwy][nwx] <= maps[now.first][now.second] + 1)
        continue; // それ以前に探索済みならスルー
      que.push_back(
          make_pair(nwy, nwx)); // このタームで行けるところは+1に塗り替え
      maps[nwy][nwx] = maps[now.first][now.second] + 1;
    }
  }

  if (maps[Dh - 1][Dw - 1] != INF) {
    cout << maps[Dh - 1][Dw - 1] << endl;
  } else {
    cout << -1 << endl;
  }

  // rep(i,H){
  //     rep(j,W){
  //         if(S[i][j]!='#'){
  //         cout << maps[i][j];
  //         }else{
  //             cout << "#" ;
  //         }
  //     }
  //     cout << endl;
  // }

  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rep2(i, x, n) for (int i = x; i < (n); i++)
#define all(n) begin(n), end(n)
struct cww {
  cww() {
    ios::sync_with_stdio(false);
    cin.tie(0);
  }
} star;
const long long INF = numeric_limits<long long>::max();
using ll = long long;
// 座標 corrdinate と深さを保持するための構造体
struct Corr {
  ll y;
  ll x;
  ll depth;
};

int main() {
  int H, W;
  cin >> H >> W;
  int Ch, Cw, Dh, Dw;
  cin >> Ch >> Cw >> Dh >> Dw;
  vector<string> S(H);
  rep(i, H) { cin >> S[i]; }
  vector<vector<ll>> maps(H, vector<ll>(W, INF));

  maps[Ch - 1][Cw - 1] = 0; // スタートは0回
  // 0回ワープで行けるマスを全て洗い出す、
  // それらのマスから1回ワープして行けるマスのうちまだ行けてないマスを全て洗い出す
  // ワープは最大でも1000回
  queue<pair<int, int>> que;
  que.emplace(make_pair(Ch - 1, Cw - 1));
  int dy[4] = {0, 0, 1, -1}; // dx,dy は次の探索場所への距離を表す（４方向分）
  int dx[4] = {1, -1, 0, 0};
  int dwy[20] = {
      1, 1, -1, -1, 2,  2,  2,  2,  2, 1, 1,
      0, 0, -1, -1, -2, -2, -2, -2, -2}; // dwx,dwy
                                         // は次の探索場所への距離を表す（ワープ分）
  int dwx[20] = {1, -1, -1, 1,  -2, -1, 0,  1, 2, -2,
                 2, -2, 2,  -2, 2,  -2, -1, 0, 1, 2};
  while (que.size() != 0) { // キューの要素がなくなったら終了
    pair<int, int> now = que.front(); // 現在の状態
    que.pop();

    for (int i = 0; i < 4; i++) {
      int ny = now.first + dy[i];  // 次の探索場所の行番号
      int nx = now.second + dx[i]; // 次の探索場所の列番号
      if (ny < 0 || H <= ny || nx < 0 || W <= nx)
        continue; // 迷路の外に出るならスルー
      if (S[ny][nx] == '#')
        continue; // 障害物があればスルー
      if (maps[ny][nx] <= maps[now.first][now.second])
        continue; // それ以前に探索済みならスルー
      que.push(make_pair(ny, nx));
      maps[ny][nx] = maps[now.first][now.second];
    }
    for (int k = 0; k < 20; k++) {
      int nwy = now.first + dwy[k];
      int nwx = now.second + dwx[k];
      if (nwy < 0 || H <= nwy || nwx < 0 || W <= nwx)
        continue; // 迷路の外に出るならスルー
      if (S[nwy][nwx] == '#')
        continue; // 障害物があればスルー
      if (maps[nwy][nwx] <= maps[now.first][now.second] + 1)
        continue; // それ以前に探索済みならスルー
      que.push(make_pair(nwy, nwx)); // このタームで行けるところは+1に塗り替え
      maps[nwy][nwx] = maps[now.first][now.second] + 1;
    }
  }

  if (maps[Dh - 1][Dw - 1] != INF) {
    cout << maps[Dh - 1][Dw - 1] << endl;
  } else {
    cout << -1 << endl;
  }

  // rep(i,H){
  //     rep(j,W){
  //         if(S[i][j]!='#'){
  //         cout << maps[i][j];
  //         }else{
  //             cout << "#" ;
  //         }
  //     }
  //     cout << endl;
  // }

  return 0;
}