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

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); i++)
using namespace std;
using ll = long long;

int H, W, Ch, Cw, Dh, Dw;
queue<pair<int, int>> que;

int dfs(vector<vector<char>> &S, int x, int y, vector<vector<int>> &num,
        int mg) {
  // 通ったことある場合はスルー
  if (num[x][y] != -1)
    return 0;
  // 通ったチェック
  num[x][y] = mg;
  que.push(pair(x, y));
  // ４方向移動
  if (x - 1 >= 0 && S[x - 1][y] == '.')
    dfs(S, x - 1, y, num, mg);
  if (x + 1 < H && S[x + 1][y] == '.')
    dfs(S, x + 1, y, num, mg);
  if (y - 1 >= 0 && S[x][y - 1] == '.')
    dfs(S, x, y - 1, num, mg);
  if (y + 1 < W && S[x][y + 1] == '.')
    dfs(S, x, y + 1, num, mg);
  return 0;
}

bool wdfs(vector<vector<char>> &S, vector<vector<int>> &num, int mg) {
  bool flg = true;
  queue<pair<int, int>> wque = que;
  while (que.size())
    que.pop();
  while (wque.size()) {
    auto z = wque.front();
    wque.pop();
    int i = z.first, j = z.second;
    if (num[i][j] != mg)
      continue;
    // if(mg==1) cerr << "i;j " << i << " " << j << endl;
    // ワープ移動
    vector<int> wp = {-2, -1, 0, 1, 2};
    for (int wx : wp) {
      for (int wy : wp) {
        if (i + wx < 0 || i + wx >= H || j + wy < 0 || j + wy >= W)
          continue; // 範囲外
        if (S[i + wx][j + wy] == '#')
          continue; // 壁
        if (num[i + wx][j + wy] != -1)
          continue;

        // num[i+wx][j+wy]=mg+1;
        dfs(S, i + wx, j + wy, num, mg + 1);
        flg = false;
      }
    }
  }

  return flg;
}

int main() {
  ios::sync_with_stdio(false);
  cin >> H >> W;
  cin >> Ch >> Cw;
  cin >> Dh >> Dw;
  vector<vector<char>> S(H, vector<char>(W));
  vector<vector<int>> num(H, vector<int>(W, -1));
  rep(i, H) rep(j, W) cin >> S[i][j];

  int ans = dfs(S, Ch - 1, Cw - 1, num, 0);
  bool flg = wdfs(S, num, 0);
  // while(que.size()) que.pop();
  int mg = 0;
  while (!wdfs(S, num, mg + 1)) {
    mg++;
  }

  cout << num[Dh - 1][Dw - 1] << endl;
  // rep(i,H){
  // 	rep(j,W){
  // 		cerr<<num[i][j];
  // 	}cerr << endl;
  // }
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); i++)
using namespace std;
using ll = long long;

int H, W, Ch, Cw, Dh, Dw;

int dfs(vector<vector<char>> &S, int x, int y, vector<vector<int>> &num,
        int mg) {
  // 通ったことある場合はスルー
  if (num[x][y] != -1)
    return 0;
  // 通ったチェック
  num[x][y] = mg;

  // ４方向移動
  if (x - 1 >= 0 && S[x - 1][y] == '.')
    dfs(S, x - 1, y, num, mg);
  if (x + 1 < H && S[x + 1][y] == '.')
    dfs(S, x + 1, y, num, mg);
  if (y - 1 >= 0 && S[x][y - 1] == '.')
    dfs(S, x, y - 1, num, mg);
  if (y + 1 < W && S[x][y + 1] == '.')
    dfs(S, x, y + 1, num, mg);
  return 0;
}

bool wdfs(vector<vector<char>> &S, vector<vector<int>> &num, int mg) {
  bool flg = true;
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      if (num[i][j] != mg)
        continue;
      // if(mg==1) cerr << "i;j " << i << " " << j << endl;
      // ワープ移動
      vector<int> wp = {-2, -1, 0, 1, 2};
      for (int wx : wp) {
        for (int wy : wp) {
          if (i + wx < 0 || i + wx >= H || j + wy < 0 || j + wy >= W)
            continue; // 範囲外
          if (S[i + wx][j + wy] == '#')
            continue; // 壁
          if (num[i + wx][j + wy] != -1)
            continue;

          // num[i+wx][j+wy]=mg+1;
          dfs(S, i + wx, j + wy, num, mg + 1);
          flg = false;
        }
      }
    }
  }
  return flg;
}

int main() {
  ios::sync_with_stdio(false);
  cin >> H >> W;
  cin >> Ch >> Cw;
  cin >> Dh >> Dw;
  vector<vector<char>> S(H, vector<char>(W));
  vector<vector<int>> num(H, vector<int>(W, -1));
  rep(i, H) rep(j, W) cin >> S[i][j];

  int ans = dfs(S, Ch - 1, Cw - 1, num, 0);
  bool flg = wdfs(S, num, 0);
  int mg = 0;
  while (!wdfs(S, num, mg + 1) && mg < 1000) {
    mg++;
  }

  cout << num[Dh - 1][Dw - 1] << endl;
  rep(i, H) {
    rep(j, W) { cerr << num[i][j]; }
    cerr << endl;
  }
}