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

#include <deque>
#include <iostream>
#include <queue>
#include <vector>
#define INF 0x3f3f3f3f

using namespace std;

const int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, -1, 0, 1};
int h, w, sx, sy, ex, ey;

int main() {
  cin >> h >> w >> sx >> sy >> ex >> ey;
  sx--, sy--, ex--, ey--;
  vector<string> a(h);
  for (int i = 0; i < h; ++i)
    cin >> a[i];
  vector<vector<int>> dist(h, vector<int>(w, INF));
  vector<vector<bool>> vis(h, vector<bool>(w, false));
  deque<pair<int, int>> q;
  q.push_back({sx, sy});
  dist[sx][sy] = 0;
  while (!q.empty()) {
    auto f = q.front();
    q.pop_front();
    int ci = f.first, cj = f.second;
    if (ci == ex && cj == ey) {
      cout << dist[ci][cj];
      return 0;
    }
    if (vis[ci][cj])
      continue;
    vis[ci][cj] = true;

    for (int k = 0; k < 4; ++k) {
      int ni = ci + dy[k], nj = cj + dx[k];
      if (ni < 0 || ni >= h || nj < 0 || nj >= w ||
          dist[ni][nj] <= dist[ci][cj] || a[ni][nj] == '#')
        continue;
      dist[ni][nj] = dist[ci][cj];
      q.push_front({ni, nj});
    }

    for (int ni = ci - 2; ni <= ci + 2; ++ni)
      for (int nj = cj - 2; nj <= cj + 2; ++nj) {
        if (ni < 0 || ni >= h || nj < 0 || nj >= w || a[ni][nj] == '#' ||
            dist[ni][nj] <= dist[ci][cj] + 1)
          continue;
        dist[ni][nj] = dist[ci][cj] + 1;
        q.push_back({ni, nj});
      }
  }
  cout << -1;
}


Error: TLE

Fixed submission:

/*
 _ _ _   _    _   _    _   _ _ _   _    _   _ __ _   __       __
|  _ _| | |  | | | |  | | |  _  | | |  | | |  __  | |   \\   /   |
| |_ _  | |__| | | |  | | | |_| | | |__| | | |__| | | |\\ \\_/ /| |
|_ _  | |  __  | | |  | | |  _ <  |  __  | |  __  | | | \\   / | |
 _ _| | | |  | | | |__| | | |_| | | |  | | | |  | | | |  \\_/  | |  _   _   _
|_ _ _| |_|  |_| |_ __ _| |_ _ _| |_|  |_| |_|  |_| |_|       |_| |_| |_| |_|

*/

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

#define ll long long int
#define fi first
#define se second
#define pb push_back
#define all(a) (a).begin(), (a).end()
#define debug(a) cout << #a << " = " << a << " ";
#define endl "\\n"
const int MOD = 1000000007;

const int dx[4] = {-1, 0, 0, 1};
const int dy[4] = {0, -1, 1, 0};

int n, m;
char a[1005][1005];
int vis[1005][1005] = {0};
bool seen[1005][1005];
int ans;

void dfs(int x, int y, int set) {
  vis[x][y] = set;
  for (int i = 0; i < 4; i++) {
    if (x + dx[i] <= 0 || x + dx[i] > n || y + dy[i] <= 0 || y + dy[i] > m)
      continue;
    if (vis[x + dx[i]][y + dy[i]] == 0 && a[x + dx[i]][y + dy[i]] == '.') {
      dfs(x + dx[i], y + dy[i], set);
    }
  }
}

void bfs(int stx, int sty, int edx, int edy) {
  queue<pair<pair<int, int>, int>> q;
  q.push({{stx, sty}, 0});
  seen[stx][sty] = true;
  while (!q.empty()) {
    int x = q.front().fi.fi, y = q.front().fi.se, magic = q.front().se;
    q.pop();
    if (x == edx && y == edy) {
      ans = min(ans, magic);
      return;
    }
    seen[x][y] = true;
    for (int i = 0; i < 4; i++) {
      if (x + dx[i] <= 0 || x + dx[i] > n || y + dy[i] <= 0 || y + dy[i] > m)
        continue;
      if (!seen[x + dx[i]][y + dy[i]] && a[x + dx[i]][y + dy[i]] == '.') {
        seen[x + dx[i]][y + dy[i]] = true;
        q.push({{x + dx[i], y + dy[i]}, magic});
      }
    }
    for (int i = -2; i <= 2; i++) {
      for (int j = -2; j <= 2; j++) {
        if (x + i <= 0 || x + i > n || y + j <= 0 || y + j > m)
          continue;
        if (!seen[x + i][y + j] && a[x + i][y + j] == '.' &&
            vis[x][y] != vis[x + i][y + j]) {
          // seen[x+i][y+j]=true;
          q.push({{x + i, y + j}, magic + 1});
        }
      }
    }
  }
}

void solve() {
  cin >> n >> m;
  int stx, sty;
  cin >> stx >> sty;
  int edx, edy;
  cin >> edx >> edy;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++)
      cin >> a[i][j];
  }
  int xx = 1;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (vis[i][j] == 0 && a[i][j] == '.') {
        dfs(i, j, xx);
        xx++;
      }
    }
  }
  if (vis[stx][sty] == vis[edx][edy]) {
    cout << "0\\n";
    return;
  }
  ans = INT_MAX;
  bfs(stx, sty, edx, edy);
  if (ans == INT_MAX) {
    cout << "-1\\n";
  } else {
    cout << ans << endl;
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long int t = 1;
  // cin>>t;
  for (long int tt = 1; tt <= t; tt++) {
    solve();
  }
  return 0;
}