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

#include <algorithm>
#include <deque>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <vector>
long long int mod = 1000000007;
long long modpow(long long a, long long n, long long mod);
long long modinv(long long a, long long mod);
long long int a[200000];
char s[1000][1000];
int wc[1000][1000];
using namespace std;
int co[300000];
int ro[300000];
int main() {

  // E
  /*int h, w, m;
  cin >> h >> w >> m;

  int m;
  int i, c, r;
  for (i = 0; i < m; i++) {
          cin >> c >> r;
          co[ ]
  }
  */

  // D
  int h, w;
  int ch, cw, dh, dw;
  cin >> h >> w;
  cin >> ch >> cw;
  cin >> dh >> dw;
  ch--;
  cw--;
  dh--;
  dw--;
  int i, j;
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
      cin >> s[i][j];
      wc[i][j] = 100000000;
    }
  }

  queue<pair<int, int>> que, que2;
  pair<int, int> p, pp;
  // int wp = 0;
  p.first = ch;
  p.second = cw;
  wc[ch][cw] = 0;
  que.push(p);
  // que2.push(p);
  while (1) {
    while (que.size()) {

      p = que.front();
      que.pop();
      que2.push(p);
      if (p.first > 0) {
        if (wc[p.first - 1][p.second] > wc[p.first][p.second]) {
          if (s[p.first - 1][p.second] == '.') {
            wc[p.first - 1][p.second] = wc[p.first][p.second];
            pp.first = p.first - 1;
            pp.second = p.second;
            que.push(pp);
            // que2.push(pp);
            // cout << pp.first << ' ' << pp.second << endl;
          }
        }
      }

      if (p.first < h - 1) {
        if (wc[p.first + 1][p.second] > wc[p.first][p.second]) {
          if (s[p.first + 1][p.second] == '.') {
            wc[p.first + 1][p.second] = wc[p.first][p.second];
            pp.first = p.first + 1;
            pp.second = p.second;
            que.push(pp);
            // que2.push(pp);
            // cout << pp.first << ' ' << pp.second << endl;
          }
        }
      }

      if (p.second > 0) {
        if (wc[p.first][p.second - 1] > wc[p.first][p.second]) {
          if (s[p.first][p.second - 1] == '.') {
            wc[p.first][p.second - 1] = wc[p.first][p.second];
            pp.first = p.first;
            pp.second = p.second - 1;
            que.push(pp);
            // que2.push(pp);
            // cout << pp.first << ' ' << pp.second << endl;
          }
        }
      }

      if (p.second < w - 1) {
        if (wc[p.first][p.second + 1] > wc[p.first][p.second]) {
          if (s[p.first][p.second + 1] == '.') {
            wc[p.first][p.second + 1] = wc[p.first][p.second];
            pp.first = p.first;
            pp.second = p.second + 1;
            que.push(pp);
            // que2.push(pp);
            ; // cout << pp.first << ' ' << pp.second << endl;
          }
        }
      }
    }
    while (que2.size()) {
      p = que2.front();
      que2.pop();
      for (i = -2; i <= 2; i++) {
        for (j = -2; j <= 2; j++) {

          if ((p.first + i < h) && (p.first + i >= 0) && (p.second + j < w) &&
              (p.second + j >= 0)) {
            if (wc[p.first + i][p.second + j] > wc[p.first][p.second] + 1) {
              if (s[p.first + i][p.second + j] == '.') {
                wc[p.first + i][p.second + j] = wc[p.first][p.second] + 1;
                pp.first = p.first + i;
                pp.second = p.second + j;
                que.push(pp);
              }
            }
          }
        }
      }
    }
    if (que.size() == 0)
      break;
  }
  // for (i = 0; i < h; i++) {
  //	for (j = 0; j < w; j++) {
  //		if (wc[i][j] == 100000000) {
  //			cout << '#';
  //		}
  //		else {
  //			cout << wc[i][j];
  //		}
  //	}
  //	cout << endl;
  // }
  if (wc[dh][dw] == 100000000) {
    cout << -1 << endl;
  } else {
    cout << wc[dh][dw] << endl;
  }
  return 0;

  // C
  /*int n;

  cin >> n;
  int i;
  for (i = 0; i < n; i++) {
          cin >> a[i];
  }
  long long int s = 0;
  long long int m = a[0];
  for (i = 1; i < n; i++) {
          if (a[i] > m) {
                  m = a[i];
          }
          else {
                  s = s + m - a[i];
          }
  }
  cout << s << endl;
  return 0;
  */

  // B
  /*string s;
  cin >> s;
  int n = 0;
  int i;
  for (i = 0; i < s.length(); i++) {
          n = n + (s[i] - '0');
          n = n % 9;
  }
  if (n == 0) {
          cout << "Yes" << endl;
  }
  else {
          cout << "No" << endl;

  }
  return 0;*/

  // A
  /*int n, x, t;
  cin >> n >> x >> t;
  cout << ((n - 1) / x) * t + t << endl;

  return 0;
  */
}
// a^n mod を計算する
long long modpow(long long a, long long n, long long mod) {
  long long res = 1;
  while (n > 0) {
    if (n & 1)
      res = res * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return res;
}

// a^{-1} mod を計算する
long long modinv(long long a, long long mod) { return modpow(a, mod - 2, mod); }

Error: TLE

Fixed submission:

#include <algorithm>
#include <deque>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <vector>
long long int mod = 1000000007;
long long modpow(long long a, long long n, long long mod);
long long modinv(long long a, long long mod);
long long int a[200000];
char s[1000][1000];
int wc[1000][1000];
using namespace std;
int main() {

  // D
  int h, w;
  int ch, cw, dh, dw;
  cin >> h >> w;
  cin >> ch >> cw;
  cin >> dh >> dw;
  ch--;
  cw--;
  dh--;
  dw--;
  int i, j;
  for (i = 0; i < h; i++) {
    for (j = 0; j < w; j++) {
      cin >> s[i][j];
      wc[i][j] = 100000000;
    }
  }

  queue<pair<int, int>> que;
  pair<int, int> p, pp;
  int wp = 0;
  p.first = ch;
  p.second = cw;
  wc[ch][cw] = 0;
  que.push(p);
  while (que.size()) {

    p = que.front();
    que.pop();
    if (p.first > 0) {
      if (wc[p.first - 1][p.second] > wc[p.first][p.second]) {
        if (s[p.first - 1][p.second] == '.') {
          wc[p.first - 1][p.second] = wc[p.first][p.second];
          pp.first = p.first - 1;
          pp.second = p.second;
          que.push(pp);
          // cout << pp.first << ' ' << pp.second << endl;
        }
      }
    }

    if (p.first < h - 1) {
      if (wc[p.first + 1][p.second] > wc[p.first][p.second]) {
        if (s[p.first + 1][p.second] == '.') {
          wc[p.first + 1][p.second] = wc[p.first][p.second];
          pp.first = p.first + 1;
          pp.second = p.second;
          que.push(pp);
          // cout << pp.first << ' ' << pp.second << endl;
        }
      }
    }

    if (p.second > 0) {
      if (wc[p.first][p.second - 1] > wc[p.first][p.second]) {
        if (s[p.first][p.second - 1] == '.') {
          wc[p.first][p.second - 1] = wc[p.first][p.second];
          pp.first = p.first;
          pp.second = p.second - 1;
          que.push(pp);
          // cout << pp.first << ' ' << pp.second << endl;
        }
      }
    }

    if (p.second < w - 1) {
      if (wc[p.first][p.second + 1] > wc[p.first][p.second]) {
        if (s[p.first][p.second + 1] == '.') {
          wc[p.first][p.second + 1] = wc[p.first][p.second];
          pp.first = p.first;
          pp.second = p.second + 1;
          que.push(pp);
          // cout << pp.first << ' ' << pp.second << endl;
        }
      }
    }
    for (i = -2; i <= 2; i++) {
      for (j = -2; j <= 2; j++) {

        if ((p.first + i < h) && (p.first + i >= 0) && (p.second + j < w) &&
            (p.second + j >= 0)) {
          if (wc[p.first + i][p.second + j] > wc[p.first][p.second] + 1) {
            if (s[p.first + i][p.second + j] == '.') {
              wc[p.first + i][p.second + j] = wc[p.first][p.second] + 1;
              pp.first = p.first + i;
              pp.second = p.second + j;
              que.push(pp);
            }
          }
        }
      }
    }
  }
  // for (i = 0; i < h; i++) {
  //	for (j = 0; j < w; j++) {
  //		cout << wc[i][j];
  //	}
  //	cout << endl;
  //	}
  if (wc[dh][dw] == 100000000) {
    cout << -1 << endl;
  } else {
    cout << wc[dh][dw] << endl;
  }
  return 0;

  // C
  /*int n;

  cin >> n;
  int i;
  for (i = 0; i < n; i++) {
          cin >> a[i];
  }
  long long int s = 0;
  long long int m = a[0];
  for (i = 1; i < n; i++) {
          if (a[i] > m) {
                  m = a[i];
          }
          else {
                  s = s + m - a[i];
          }
  }
  cout << s << endl;
  return 0;
  */

  // B
  /*string s;
  cin >> s;
  int n = 0;
  int i;
  for (i = 0; i < s.length(); i++) {
          n = n + (s[i] - '0');
          n = n % 9;
  }
  if (n == 0) {
          cout << "Yes" << endl;
  }
  else {
          cout << "No" << endl;

  }
  return 0;*/

  // A
  /*int n, x, t;
  cin >> n >> x >> t;
  cout << ((n - 1) / x) * t + t << endl;

  return 0;
  */
}
// a^n mod を計算する
long long modpow(long long a, long long n, long long mod) {
  long long res = 1;
  while (n > 0) {
    if (n & 1)
      res = res * a % mod;
    a = a * a % mod;
    n >>= 1;
  }
  return res;
}

// a^{-1} mod を計算する
long long modinv(long long a, long long mod) { return modpow(a, mod - 2, mod); }