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

#include <algorithm>
#include <climits>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <vector>

using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
typedef pair<ll, P> PP;
const ll INF = LLONG_MAX;
vector<int> xnorm = {0, 1, 0, -1};
vector<int> ynorm = {1, 0, -1, 0};
vector<int> xmagic = {-2, -1, 0,  1,  2,  2,  2,  2, 2, 1,
                      0,  -1, -2, -2, -2, -2, -1, 1, 1, -1};
vector<int> ymagic = {2,  2,  2,  2,  2, 1, 0, -1, -2, -2,
                      -2, -2, -2, -1, 0, 1, 1, 1,  -1, -1};

int main() {
  ll h, w;
  cin >> h >> w;
  ll ch, cw, dh, dw;
  cin >> ch >> cw >> dh >> dw;
  ch--;
  cw--;
  dh--;
  dw--;
  vector<vector<char>> s(h, vector<char>(w));
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> s[i][j];
    }
  }
  priority_queue<PP, vector<PP>, greater<PP>> q;
  vector<vector<ll>> dist(h + 5, vector<ll>(w + 5, INF));
  dist[ch][cw] = 0;
  q.push(make_pair(0, make_pair(ch, cw)));
  while (!q.empty()) {
    auto item = q.top();
    q.pop();

    for (int i = 0; i < 4; i++) {
      ll tempx = item.second.first + xnorm[i];
      ll tempy = item.second.second + ynorm[i];
      if (tempx > h - 1 || tempx < 0 || tempy > w - 1 || tempy < 0) {
        continue;
      }
      if (s[tempx][tempy] != '.') {
        continue;
      }
      if (dist[tempx][tempy] <= item.first) {
        continue;
      }
      dist[tempx][tempy] = item.first;
      q.push(make_pair(dist[tempx][tempy], make_pair(tempx, tempy)));
    }
    for (int i = 0; i < 20; i++) {
      ll tempx = item.second.first + xmagic[i];
      ll tempy = item.second.second + ymagic[i];
      if (tempx > h - 1 || tempx < 0 || tempy > w - 1 || tempy < 0) {
        continue;
      }
      if (s[tempx][tempy] != '.') {
        continue;
      }
      if (dist[tempx][tempy] <= item.first + 1) {
        continue;
      }
      dist[tempx][tempy] = item.first + 1;
      q.push(make_pair(dist[tempx][tempy], make_pair(tempx, tempy)));
    }
  }
  if (dist[dh][dw] != INF) {
    cout << dist[dh][dw] << endl;
  } else {
    cout << -1 << endl;
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <climits>
#include <cmath>
#include <iostream>
#include <map>
#include <queue>
#include <vector>

using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
const ll INF = LLONG_MAX;
vector<int> xnorm = {0, 1, 0, -1};
vector<int> ynorm = {1, 0, -1, 0};
vector<int> xmagic = {-2, -1, 0, 1, 2, 2, 2, 2, 2, 1, 0, -1, -2, -2, -2, -2};
vector<int> ymagic = {2, 2, 2, 2, 2, 1, 0, -1, -2, -2, -2, -2, -2, -1, 0, 1};

int main() {
  ll h, w;
  cin >> h >> w;
  ll ch, cw, dh, dw;
  cin >> ch >> cw >> dh >> dw;
  ch--;
  cw--;
  dh--;
  dw--;
  vector<vector<char>> s(h, vector<char>(w));
  for (int i = 0; i < h; i++) {
    for (int j = 0; j < w; j++) {
      cin >> s[i][j];
    }
  };
  priority_queue<pair<ll, P>> q;
  vector<vector<ll>> dist(h + 5, vector<ll>(w + 5, INF));
  dist[ch][cw] = 0;
  q.emplace(0, make_pair(ch, cw));
  while (!q.empty()) {
    auto item = q.top();
    q.pop();

    for (int i = 0; i < 4; i++) {
      ll tempx = item.second.first + xnorm[i];
      ll tempy = item.second.second + ynorm[i];
      if (tempx > h - 1 || tempx < 0 || tempy > w - 1 || tempy < 0) {
        continue;
      }
      if (s[tempx][tempy] != '.') {
        continue;
      }
      if (dist[tempx][tempy] <= item.first) {
        continue;
      }
      dist[tempx][tempy] = item.first;
      q.push(make_pair(dist[tempx][tempy], make_pair(tempx, tempy)));
    }
    for (int i = 0; i < 16; i++) {
      ll tempx = item.second.first + xmagic[i];
      ll tempy = item.second.second + ymagic[i];
      if (tempx > h - 1 || tempx < 0 || tempy > w - 1 || tempy < 0) {
        continue;
      }
      if (s[tempx][tempy] != '.') {
        continue;
      }
      if (dist[tempx][tempy] <= item.first + 1) {
        continue;
      }
      dist[tempx][tempy] = item.first + 1;
      q.push(make_pair(dist[tempx][tempy], make_pair(tempx, tempy)));
    }
  }
  if (dist[dh][dw] != INF) {
    cout << dist[dh][dw] << endl;
  } else {
    cout << -1 << endl;
  }
  return 0;
}