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

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

int H, W;
queue<pair<int, int>> Check;

void search(int x, int y, vector<string> &M) {
  if (x > 0 && M.at(x - 1).at(y) == '.') {
    M.at(x - 1).at(y) = 's';
    Check.push(make_pair(x - 1, y));
    search(x - 1, y, M);
  }
  if (x < H - 1 && M.at(x + 1).at(y) == '.') {
    M.at(x + 1).at(y) = 's';
    Check.push(make_pair(x + 1, y));
    search(x + 1, y, M);
  }
  if (y > 0 && M.at(x).at(y - 1) == '.') {
    M.at(x).at(y - 1) = 's';
    Check.push(make_pair(x, y - 1));
    search(x, y - 1, M);
  }
  if (y < W - 1 && M.at(x).at(y + 1) == '.') {
    M.at(x).at(y + 1) = 's';
    Check.push(make_pair(x, y + 1));
    search(x, y + 1, M);
  }

  M.at(x).at(y) = 'S';

  return;
}

int main() {
  int Ch, Cw, Dh, Dw;
  cin >> H >> W >> Ch >> Cw >> Dh >> Dw;

  vector<string> S(H);

  for (int i = 0; i < H; i++) {
    cin >> S.at(i);
  }

  S.at(Ch - 1).at(Cw - 1) = 's';
  int magic = 0;

  queue<pair<int, int>> Start;
  Start.push(make_pair(Ch - 1, Cw - 1));

  pair<int, int> X;

  while (true) {

    Check = Start;

    if (Start.empty()) {
      cout << -1 << endl;
      break;
    }

    while (!Start.empty()) {
      X = Start.front();
      search(X.first, X.second, S);
      Start.pop();
    }

    if (S.at(Dh - 1).at(Dw - 1) == 'S') {
      cout << magic << endl;
      break;
    }

    while (!Check.empty()) {
      X = Check.front();
      for (int i = max(X.first - 2, 0); i < min(X.first + 3, H); i++) {
        for (int j = max(X.second - 2, 0); j < min(X.second + 3, W); j++) {
          if (S.at(i).at(j) == '.') {
            S.at(i).at(j) = 's';
            Start.push(make_pair(i, j));
          }
        }
      }
      Check.pop();
    }

    magic++;
  }

  return 0;
}

Error: TLE

Fixed submission:

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

int H, W;

void search(int x, int y, vector<string> &M) {
  if (x > 0 && M.at(x - 1).at(y) == '.') {
    M.at(x - 1).at(y) = 's';
    search(x - 1, y, M);
  }
  if (x < H - 1 && M.at(x + 1).at(y) == '.') {
    M.at(x + 1).at(y) = 's';
    search(x + 1, y, M);
  }
  if (y > 0 && M.at(x).at(y - 1) == '.') {
    M.at(x).at(y - 1) = 's';
    search(x, y - 1, M);
  }
  if (y < W - 1 && M.at(x).at(y + 1) == '.') {
    M.at(x).at(y + 1) = 's';
    search(x, y + 1, M);
  }

  M.at(x).at(y) = 'S';

  return;
}

int main() {
  int Ch, Cw, Dh, Dw;
  cin >> H >> W >> Ch >> Cw >> Dh >> Dw;

  vector<string> S(H);

  for (int i = 0; i < H; i++) {
    cin >> S.at(i);
  }

  S.at(Ch - 1).at(Cw - 1) = 's';
  int magic = 0;

  queue<pair<int, int>> Start;
  Start.push(make_pair(Ch - 1, Cw - 1));

  pair<int, int> X;

  while (true) {

    if (Start.empty()) {
      cout << -1 << endl;
      break;
    }

    while (!Start.empty()) {
      X = Start.front();
      search(X.first, X.second, S);
      Start.pop();
    }

    if (S.at(Dh - 1).at(Dw - 1) == 'S') {
      cout << magic << endl;
      break;
    }

    for (int i = 0; i < H; i++) {
      for (int j = 0; j < W; j++) {
        if (S.at(i).at(j) == 'S') {
          for (int i2 = max(i - 2, 0); i2 < min(i + 3, H); i2++) {
            for (int j2 = max(j - 2, 0); j2 < min(j + 3, W); j2++) {
              if (S.at(i2).at(j2) == '.') {
                S.at(i2).at(j2) = 's';
                Start.push(make_pair(i2, j2));
              }
            }
          }
        }
      }
    }

    magic++;
  }

  return 0;
}