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

#include <bits/stdc++.h>
#include <queue>

using namespace std;
typedef long long ll;

char c[1001][1001];
bool a[1001][1001], b[1001][1001];
int h, w;
queue<int> pos, pos_next;

// void dfs(int x, int y){
//     if(y + 1 <= w && c[x][y + 1] == '.' && (a[x][y + 1] == 0 || a[x][y + 1] >
//     a[x][y])){
//         a[x][y + 1] = a[x][y];
//         pos.push(x * 1001 + y + 1);
//         dfs(x, y + 1);
//     }
//     if(y - 1 >= 1 && c[x][y - 1] == '.' && (a[x][y - 1] == 0 || a[x][y - 1] >
//     a[x][y])){
//         a[x][y - 1] = a[x][y];
//         pos.push(x * 1001 + y - 1);
//         dfs(x, y - 1);
//     }
//     if(x + 1 <= h && c[x + 1][y] == '.' && (a[x + 1][y] == 0 || a[x + 1][y] >
//     a[x][y])){
//         a[x + 1][y] = a[x][y];
//         pos.push(x * 1001 + 1001 + y);
//         dfs(x + 1, y);
//     }
//     if(x - 1 >= 1 && c[x - 1][y] == '.' && (a[x - 1][y] == 0 || a[x - 1][y] >
//     a[x][y])){
//         a[x - 1][y] = a[x][y];
//         pos.push(x * 1001 - 1001 + y);
//         dfs(x - 1, y);
//     }
// }

void dfs(int x, int y) {
  if (x < 1 || x > h || y < 1 || y > w)
    return;
  if (a[x][y])
    return;
  if (c[x][y] != '.')
    return;
  a[x][y] = true;
  pos_next.push(x * 1001 + y);
  dfs(x + 1, y);
  dfs(x - 1, y);
  dfs(x, y + 1);
  dfs(x, y - 1);
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> h >> w;
  int ch, cw, dh, dw;
  cin >> ch >> cw >> dh >> dw;
  for (int i = 1; i <= h; ++i) {
    for (int j = 1; j <= w; ++j)
      cin >> c[i][j];
  }

  pos.push(ch * 1001 + cw);
  int px, py;
  int k = 1;
  while (!pos.empty()) {
    while (!pos.empty()) {
      px = pos.front();
      pos.pop();
      pos_next.push(px);
      py = px % 1001;
      px = px / 1001;
      dfs(px, py);
    }
    // if(px == dh && py == dw){
    //     break;
    // }
    if (a[dh][dw])
      break;
    ++k;
    while (!pos_next.empty()) {
      px = pos_next.front();
      pos_next.pop();
      py = px % 1001;
      px = px / 1001;
      for (int i = (px - 2 >= 1 ? px - 2 : 1); i <= (px + 2 <= h ? px + 2 : h);
           ++i)
        for (int j = (py - 2 >= 1 ? py - 2 : 1);
             j <= (py + 2 <= w ? py + 2 : w); ++j) {
          if (c[i][j] == '.' && !a[i][j] && !b[i][j]) {
            // a[i][j] = true;
            b[i][j] = true;
            pos.push(i * 1001 + j);
          }
        }
    }
  }
  if (a[dh][dw])
    cout << k - 1 << "\\n";
  else
    cout << -1 << "\\n";
  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#include <queue>

using namespace std;
typedef long long ll;

char c[1001][1001];
bool a[1001][1001];
int h, w;
queue<int> pos, pos_next;

// void dfs(int x, int y){
//     if(y + 1 <= w && c[x][y + 1] == '.' && (a[x][y + 1] == 0 || a[x][y + 1] >
//     a[x][y])){
//         a[x][y + 1] = a[x][y];
//         pos.push(x * 1001 + y + 1);
//         dfs(x, y + 1);
//     }
//     if(y - 1 >= 1 && c[x][y - 1] == '.' && (a[x][y - 1] == 0 || a[x][y - 1] >
//     a[x][y])){
//         a[x][y - 1] = a[x][y];
//         pos.push(x * 1001 + y - 1);
//         dfs(x, y - 1);
//     }
//     if(x + 1 <= h && c[x + 1][y] == '.' && (a[x + 1][y] == 0 || a[x + 1][y] >
//     a[x][y])){
//         a[x + 1][y] = a[x][y];
//         pos.push(x * 1001 + 1001 + y);
//         dfs(x + 1, y);
//     }
//     if(x - 1 >= 1 && c[x - 1][y] == '.' && (a[x - 1][y] == 0 || a[x - 1][y] >
//     a[x][y])){
//         a[x - 1][y] = a[x][y];
//         pos.push(x * 1001 - 1001 + y);
//         dfs(x - 1, y);
//     }
// }

void dfs(int x, int y) {
  if (x < 1 || x > h || y < 1 || y > w)
    return;
  if (a[x][y])
    return;
  if (c[x][y] != '.')
    return;
  a[x][y] = true;
  pos_next.push(x * 1001 + y);
  dfs(x + 1, y);
  dfs(x - 1, y);
  dfs(x, y + 1);
  dfs(x, y - 1);
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> h >> w;
  int ch, cw, dh, dw;
  cin >> ch >> cw >> dh >> dw;
  for (int i = 1; i <= h; ++i) {
    for (int j = 1; j <= w; ++j)
      cin >> c[i][j];
  }

  pos.push(ch * 1001 + cw);
  int px, py;
  int k = 1;
  while (!pos.empty()) {
    while (!pos.empty()) {
      px = pos.front();
      pos.pop();
      pos_next.push(px);
      py = px % 1001;
      px = px / 1001;
      dfs(px, py);
    }
    // if(px == dh && py == dw){
    //     break;
    // }
    if (a[dh][dw])
      break;
    ++k;
    while (!pos_next.empty()) {
      px = pos_next.front();
      pos_next.pop();
      py = px % 1001;
      px = px / 1001;
      for (int i = (px - 2 >= 1 ? px - 2 : 1); i <= (px + 2 <= h ? px + 2 : h);
           ++i)
        for (int j = (py - 2 >= 1 ? py - 2 : 1);
             j <= (py + 2 <= w ? py + 2 : w); ++j) {
          if (c[i][j] == '.' && !a[i][j]) {
            // a[i][j] = true;
            pos.push(i * 1001 + j);
          }
        }
    }
  }
  if (a[dh][dw])
    cout << k - 1 << "\\n";
  else
    cout << -1 << "\\n";
  return 0;
}