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

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define ll long long
#define qwq 1007
int h, w;
int s1, s2;
int t1, t2;
bool a[qwq][qwq];
std::deque<std::pair<int, int>> que;
int dis[qwq][qwq];
bool flag[qwq][qwq];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
int main() {
  scanf("%d%d", &h, &w);
  scanf("%d%d", &s1, &s2);
  scanf("%d%d", &t1, &t2);
  for (int i = 1; i <= h; ++i) {
    for (int j = 1; j <= w; ++j) {
      char c;
      c = getchar();
      while (c != '#' && c != '.')
        c = getchar();
      if (c == '.')
        a[i][j] = true;
    }
  }
  memset(dis, 0x3f, sizeof(dis));
  dis[s1][s2] = 0;
  que.push_back(std::make_pair(s1, s2));
  while (!que.empty()) {
    std::pair<int, int> k = que.front();
    int x = k.first, y = k.second;
    que.pop_front();
    if (!a[x][y])
      break;
    for (int i = 0; i <= 3; ++i) {
      int X = x + dx[i];
      int Y = y + dy[i];
      if (X < 0 || Y < 0 || X > h || Y > w)
        continue;
      if (a[X][Y] && dis[X][Y] > dis[x][y]) {
        que.push_front(std::make_pair(X, Y));
        dis[X][Y] = dis[x][y];
      }
    }
    for (int i = -2; i <= 2; ++i) {
      for (int j = -2; j <= 2; ++j) {
        if (i == 0 && j == 0)
          continue;
        int X = x + i, Y = y + j;
        if (X < 0 || Y < 0 || X > h || Y > w)
          continue;
        if (a[X][Y] && dis[X][Y] > dis[x][y] + 1) {
          que.push_back(std::make_pair(X, Y));
          dis[X][Y] = dis[x][y] + 1;
        }
      }
    }
  }
  if (dis[t1][t2] == 0x3f3f3f3f)
    printf("%d\\n", -1);
  else
    printf("%d\\n", dis[t1][t2]);
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#define ll long long
#define qwq 1007
int h, w;
int s1, s2;
int t1, t2;
bool a[qwq][qwq];
std::queue<std::pair<int, int>> que;
int dis[qwq][qwq];
bool flag[qwq][qwq];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
int main() {
  scanf("%d%d", &h, &w);
  scanf("%d%d", &s1, &s2);
  scanf("%d%d", &t1, &t2);
  for (int i = 1; i <= h; ++i) {
    for (int j = 1; j <= w; ++j) {
      char c;
      c = getchar();
      while (c != '#' && c != '.')
        c = getchar();
      if (c == '.')
        a[i][j] = true;
    }
  }
  memset(dis, 0x3f, sizeof(dis));
  dis[s1][s2] = 0;
  que.push(std::make_pair(s1, s2));
  while (!que.empty()) {
    std::pair<int, int> k = que.front();
    int x = k.first, y = k.second;
    que.pop();
    if (!a[x][y])
      break;
    for (int i = 0; i <= 3; ++i) {
      int X = x + dx[i];
      int Y = y + dy[i];
      if (X < 0 || Y < 0 || X > h || Y > w)
        continue;
      if (a[X][Y] && dis[X][Y] > dis[x][y]) {
        que.push(std::make_pair(X, Y));
        dis[X][Y] = dis[x][y];
      }
    }
    for (int i = -2; i <= 2; ++i) {
      for (int j = -2; j <= 2; ++j) {
        if (i == 0 && j == 0)
          continue;
        int X = x + i, Y = y + j;
        if (X < 0 || Y < 0 || X > h || Y > w)
          continue;
        if (a[X][Y] && dis[X][Y] > dis[x][y] + 1) {
          que.push(std::make_pair(X, Y));
          dis[X][Y] = dis[x][y] + 1;
        }
      }
    }
  }
  if (dis[t1][t2] == 0x3f3f3f3f)
    printf("%d\\n", -1);
  else
    printf("%d\\n", dis[t1][t2]);
  return 0;
}