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

#include <fstream>
#include <iostream>
#include <set>
#include <vector>

// BE CAREFUL WITH HASH TABLE & UNORDERED MAP
// #include <ext/pb_ds/assoc_container.hpp>
// using namespace __gnu_pbds;
using namespace std;

#define MOD 998244353
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define F0R(i, b) FOR(i, 0, b)
#define RFO(i, a, b) for (int i = (b - 1); i >= (a); i--)
#define RF0(i, b) RFO(i, 0, b)
#define ll long long
#define pii pair<int, int>
#define ppp pair<pair<pii, pii>, int>
#define add(a, b) ((int)(((ll)(a) + (b)) % MOD))
#define mul(a, b) ((int)(((ll)(a) * (b)) % MOD))
#define PB emplace_back
#define MP make_pair
#define F first
#define S second

// ifstream cin ("cinput.in");
// ofstream cout ("coutput.out");

int H, W, K, x1, y1, x2, y2;
int moves[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
char a;
vector<vector<int>> grid;
set<ppp> queue; // ((priority, cost), (r,c))

bool valid(int r, int c) { return (0 <= r && r < H && 0 <= c && c < W); }

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> H >> W >> K;
  cin >> x1 >> y1 >> x2 >> y2;
  x1--;
  y1--;
  x2--;
  y2--;
  F0R(i, H) {
    grid.PB(vector<int>());
    F0R(j, W) grid[i].PB(2000000);
  }
  F0R(i, H) F0R(j, W) {
    cin >> a;
    if (a == '@')
      grid[i][j] = -1;
  }

  // Dijkstra's
  grid[x1][y1] = 0;
  queue.emplace(MP(MP(MP(4, 0), MP(x1, y1)), 0));
  while (!queue.empty()) {
    ppp cur = *queue.begin();
    queue.erase(queue.begin());
    if (cur.F.F.F != 4 && cur.S >= 0)
      queue.emplace(MP(MP(MP(4, cur.F.F.S), MP(cur.F.S.F, cur.F.S.S)), 0));
    cur.S = abs(cur.S);
    F0R(i, 4) {
      int nr = cur.F.S.F + moves[i][0], nc = cur.F.S.S + moves[i][1],
          nm = cur.F.F.S + (cur.F.F.F == 4), ns = cur.S + 1;
      if ((cur.F.F.F != 4 && i != cur.F.F.F) || !valid(nr, nc) ||
          grid[nr][nc] == -1 || cur.S == K || grid[nr][nc] <= nm - 1)
        continue;
      if (grid[nr][nc] > nm)
        grid[nr][nc] = nm;
      else
        ns *= -1;
      queue.emplace(MP(MP(MP(i, nm), MP(nr, nc)), ns));
    }
  }
  if (grid[x2][y2] == 2000000)
    cout << "-1\\n";
  else
    cout << grid[x2][y2] << '\\n';
}

Error: TLE

Fixed submission:

#include <fstream>
#include <iostream>
#include <set>
#include <vector>

// BE CAREFUL WITH HASH TABLE & UNORDERED MAP
// #include <ext/pb_ds/assoc_container.hpp>
// using namespace __gnu_pbds;
using namespace std;

#define MOD 998244353
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define F0R(i, b) FOR(i, 0, b)
#define RFO(i, a, b) for (int i = (b - 1); i >= (a); i--)
#define RF0(i, b) RFO(i, 0, b)
#define ll long long
#define pii pair<int, int>
#define ppp pair<pair<pii, pii>, int>
#define add(a, b) ((int)(((ll)(a) + (b)) % MOD))
#define mul(a, b) ((int)(((ll)(a) * (b)) % MOD))
#define PB emplace_back
#define MP make_pair
#define F first
#define S second

// ifstream cin ("cinput.in");
// ofstream cout ("coutput.out");

int H, W, K, x1, y1, x2, y2;
int moves[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
char a;
vector<vector<int>> grid;
set<ppp> queue; // ((priority, cost), (r,c))

bool valid(int r, int c) { return (0 <= r && r < H && 0 <= c && c < W); }

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cin >> H >> W >> K;
  cin >> x1 >> y1 >> x2 >> y2;
  x1--;
  y1--;
  x2--;
  y2--;
  F0R(i, H) {
    grid.PB(vector<int>());
    F0R(j, W) grid[i].PB(2000000);
  }
  F0R(i, H) F0R(j, W) {
    cin >> a;
    if (a == '@')
      grid[i][j] = -1;
  }

  // Dijkstra's
  grid[x1][y1] = 0;
  queue.emplace(MP(MP(MP(4, 0), MP(x1, y1)), 0));
  while (!queue.empty()) {
    ppp cur = *queue.begin();
    queue.erase(queue.begin());
    if (cur.F.F.F != 4 && cur.S >= 0)
      queue.emplace(MP(MP(MP(4, cur.F.F.S), MP(cur.F.S.F, cur.F.S.S)), 0));
    cur.S = abs(cur.S);
    F0R(i, 4) {
      int nr = cur.F.S.F + moves[i][0], nc = cur.F.S.S + moves[i][1],
          nm = cur.F.F.S + (cur.F.F.F == 4), ns = cur.S + 1;
      if ((cur.F.F.F != 4 && i != cur.F.F.F) || !valid(nr, nc) ||
          grid[nr][nc] == -1 || cur.S == K)
        continue;
      if (grid[nr][nc] > nm)
        grid[nr][nc] = nm;
      else
        ns *= -1;
      queue.emplace(MP(MP(MP(i, nm), MP(nr, nc)), ns));
    }
  }
  if (grid[x2][y2] == 2000000)
    cout << "-1\\n";
  else
    cout << grid[x2][y2] << '\\n';
}