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

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

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;
static const int MAX_H = 1001;
static const int MAX_W = 1001;
static const int INF = 20000001;

ll d[MAX_H][MAX_W];

int H, W;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};

// int m[] = {-2, -1, 0, 1, 2};

void start_up() {
  for (int i = 0; i < MAX_H; i++) {
    for (int j = 0; j < MAX_W; j++) {
      d[i][j] = INF;
    }
  }
}

ll bfs(vector<vector<char>> input, P s, P g) {

  priority_queue<array<int, 3>> q; //, t;
  q.push({0, s.first, s.second});
  // t.push(s);
  d[s.first][s.second] = 0;
  // bool flag = true;

  // while (flag) {
  // flag = false;
  while (q.size()) {
    array<int, 3> cur = q.top();
    q.pop();
    P tmp = {cur[1], cur[2]};
    // if (tmp.first == g.first && tmp.second == g.second) return
    // d[g.first][g.second]; bool flag = true;
    for (int i = 0; i < 4; i++) {
      int x = tmp.first + dx[i];
      int y = tmp.second + dy[i];
      // 今回は、inputが'.'のときが"通れる場所"としている
      if (x >= 0 && x < H && y >= 0 && y < W &&
          d[x][y] > d[tmp.first][tmp.second] && input.at(x).at(y) == '.') {
        d[x][y] = d[tmp.first][tmp.second];
        q.push({-d[x][y], x, y});
        // t.push({x, y});
      }
    }
    for (int i = -2; i <= 2; i++) {
      for (int j = -2; j <= 2; j++) {
        int x = tmp.first + i;
        int y = tmp.second + j;
        // 今回は、inputが'.'のときが"通れる場所"としている
        if (x >= 0 && x < H && y >= 0 && y < W &&
            d[x][y] > d[tmp.first][tmp.second] + 1 &&
            input.at(x).at(y) == '.') {
          // if (d[tmp.first][tmp.second] + 1 < d[g.first][g.second]) q.push({x,
          // y});
          d[x][y] = d[tmp.first][tmp.second] + 1;
          q.push({-d[x][y], x, y});
          // t.push({x, y});
          // flag = true;
        }
      }
    }
  }
  //}
  return d[g.first][g.second];
}

int main() {
  start_up();
  cin >> H >> W;
  P s, g;
  ll s_x, s_y, g_x, g_y;
  cin >> s_x >> s_y >> g_x >> g_y;
  s_x--;
  s_y--;
  g_x--;
  g_y--;
  s = {s_x, s_y};
  g = {g_x, g_y};
  vector<vector<char>> S(H, vector<char>(W));
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cin >> S.at(i).at(j);
    }
  }
  ll ans = bfs(S, s, g);
  if (ans == INF)
    cout << -1 << endl;
  else
    cout << ans << endl;
  return 0;
}


Error: TLE

Fixed submission:

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

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;
static const int MAX_H = 1001;
static const int MAX_W = 1001;
static const int INF = 20000001;

ll d[MAX_H][MAX_W];

int H, W;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};

// int m[] = {-2, -1, 0, 1, 2};

void start_up() {
  for (int i = 0; i < MAX_H; i++) {
    for (int j = 0; j < MAX_W; j++) {
      d[i][j] = INF;
    }
  }
}

ll bfs(vector<vector<char>> input, P s, P g) {

  queue<P> q; //, t;
  q.push(s);
  // t.push(s);
  d[s.first][s.second] = 0;
  // bool flag = true;

  // while (flag) {
  // flag = false;
  while (q.size()) {
    P tmp = q.front();
    q.pop();
    // if (tmp.first == g.first && tmp.second == g.second) return
    // d[g.first][g.second]; bool flag = true;
    for (int i = 0; i < 4; i++) {
      int x = tmp.first + dx[i];
      int y = tmp.second + dy[i];
      // 今回は、inputが'.'のときが"通れる場所"としている
      if (x >= 0 && x < H && y >= 0 && y < W &&
          d[x][y] > d[tmp.first][tmp.second] && input.at(x).at(y) == '.') {
        d[x][y] = d[tmp.first][tmp.second];
        q.push({x, y});
        // t.push({x, y});
      }
    }
    for (int i = -2; i <= 2; i++) {
      for (int j = -2; j <= 2; j++) {
        int x = tmp.first + i;
        int y = tmp.second + j;
        // 今回は、inputが'.'のときが"通れる場所"としている
        if (x >= 0 && x < H && y >= 0 && y < W &&
            d[x][y] > d[tmp.first][tmp.second] + 1 &&
            input.at(x).at(y) == '.') {
          // if (d[tmp.first][tmp.second] + 1 < d[g.first][g.second]) q.push({x,
          // y});
          q.push({x, y});
          // t.push({x, y});
          d[x][y] = d[tmp.first][tmp.second] + 1;
          // flag = true;
        }
      }
    }
  }
  //}
  return d[g.first][g.second];
}

int main() {
  start_up();
  cin >> H >> W;
  P s, g;
  ll s_x, s_y, g_x, g_y;
  cin >> s_x >> s_y >> g_x >> g_y;
  s_x--;
  s_y--;
  g_x--;
  g_y--;
  s = {s_x, s_y};
  g = {g_x, g_y};
  vector<vector<char>> S(H, vector<char>(W));
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cin >> S.at(i).at(j);
    }
  }
  ll ans = bfs(S, s, g);
  if (ans == INF)
    cout << -1 << endl;
  else
    cout << ans << endl;
  return 0;
}