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

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int INF = 2100100100;

int R, C;
vector<vector<char>> maze; // 迷路の内容を保存する配列
vector<vector<int>> dist;  // 距離を記録しておく配列
int sx, sy, gx, gy;

int main() {
  cin >> R >> C;
  cin >> sy >> sx;
  cin >> gy >> gx;
  sy--; // 0始まりに直す
  sx--;
  gy--;
  gx--;

  dist.assign(R, vector<int>(C, INF));  // 初期化
  maze.assign(R, vector<char>(C, '.')); // 初期化

  for (int i = 0; i < R; i++) {
    for (int j = 0; j < C; j++)
      cin >> maze[i][j];
  }

  deque<pair<int, int>> que;
  que.emplace_front(make_pair(sy, sx)); // sから探索する
  dist[sy][sx] = 0;
  while (que.size() != 0) { // キューの要素がなくなったら終了
    pair<int, int> now = que.front(); // 現在の状態
    que.pop_front();

    int dy[4] = {0, 0, 1, -1}; // dx,dy は次の探索場所への距離を表す（４方向分）
    int dx[4] = {1, -1, 0, 0};
    for (int i = 0; i < 4; i++) {
      int ny = now.first + dy[i];  // 次の探索場所の行番号
      int nx = now.second + dx[i]; // 次の探索場所の列番号
      if (ny < 0 || R <= ny || nx < 0 || C <= nx)
        continue; // 迷路の外に出るならスルー
      if (maze[ny][nx] == '#')
        continue; // 障害物があればスルー
      // if (dist[ny][nx] != INF) continue; //探索済みならスルー
      if (dist[ny][nx] > dist[now.first][now.second]) {
        que.push_front(make_pair(ny, nx));
      }
      dist[ny][nx] = min(dist[ny][nx], dist[now.first][now.second]);
    }
    for (int i = -2; i <= 2; i++) {
      for (int y = -2; y <= 2; y++) {
        int ny = now.first + i;  // 次の探索場所の行番号
        int nx = now.second + y; // 次の探索場所の列番号
        if (ny < 0 || R <= ny || nx < 0 || C <= nx)
          continue; // 迷路の外に出るならスルー
        if (maze[ny][nx] == '#')
          continue; // 障害物があればスルー
        // if (dist[ny][nx] != INF) continue; //探索済みならスルー
        if (dist[ny][nx] > dist[now.first][now.second] + 1) {
          que.push_back(make_pair(ny, nx));
        }
        dist[ny][nx] = min(dist[now.first][now.second] + 1, dist[ny][nx]);
      }
    }
  }

  if (dist[gy][gx] > 1e7) {
    cout << -1 << endl;
    return 0;
  }
  cout << dist[gy][gx] << endl;

  return 0;
}

Error: TLE

Fixed submission:

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int INF = 2100100100;

int R, C;
vector<string> maze(1050); // 迷路の内容を保存する配列
vector<vector<int>> dist;  // 距離を記録しておく配列
int sx, sy, gx, gy;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> R >> C;
  cin >> sy >> sx;
  cin >> gy >> gx;
  sy--; // 0始まりに直す
  sx--;
  gy--;
  gx--;

  dist.assign(R, vector<int>(C, INF)); // 初期化

  for (int i = 0; i < R; i++) {
    cin >> maze[i];
  }

  queue<pair<int, int>> que;
  que.emplace(make_pair(sy, sx)); // sから探索する
  dist[sy][sx] = 0;
  int ti = clock();
  while (clock() - ti < 180 * CLOCKS_PER_SEC / 100) {
    while (que.size() != 0) { // キューの要素がなくなったら終了
      pair<int, int> now = que.front(); // 現在の状態
      que.pop();

      if (now.first == gy && now.second == gx) { // 目的地にたどり着いたので終了
                                                 // break;
      }

      int dy[4] = {0, 0, 1,
                   -1}; // dx,dy は次の探索場所への距離を表す（４方向分）
      int dx[4] = {1, -1, 0, 0};
      for (int i = 0; i < 4; i++) {
        int ny = now.first + dy[i];  // 次の探索場所の行番号
        int nx = now.second + dx[i]; // 次の探索場所の列番号
        if (ny < 0 || R <= ny || nx < 0 || C <= nx)
          continue; // 迷路の外に出るならスルー
        if (maze[ny][nx] == '#')
          continue; // 障害物があればスルー
        // if (dist[ny][nx] != INF) continue; //探索済みならスルー
        if (dist[ny][nx] > dist[now.first][now.second]) {
          que.push(make_pair(ny, nx));
        }
        dist[ny][nx] = min(dist[ny][nx], dist[now.first][now.second]);
      }
      for (int i = -2; i <= 2; i++) {
        for (int y = -2; y <= 2; y++) {
          int ny = now.first + i;  // 次の探索場所の行番号
          int nx = now.second + y; // 次の探索場所の列番号
          if (ny < 0 || R <= ny || nx < 0 || C <= nx)
            continue; // 迷路の外に出るならスルー
          if (maze[ny][nx] == '#')
            continue; // 障害物があればスルー
          // if (dist[ny][nx] != INF) continue; //探索済みならスルー
          if (dist[ny][nx] > dist[now.first][now.second] + 1) {
            que.push(make_pair(ny, nx));
          }
          dist[ny][nx] = min(dist[now.first][now.second] + 1, dist[ny][nx]);
        }
      }
    }
  }

  if (dist[gy][gx] > 1e7) {
    cout << -1 << endl;
    return 0;
  }

  cout << dist[gy][gx] << endl;

  return 0;
}