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

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

#define ll long long
const int MOD = 1e9 + 7;
ll mod(ll x) { return (x % MOD + MOD) % MOD; }
ll mul(ll a, ll b) { return mod(mod(a) * mod(b)); }

int n, m, K;

bool issafe(int x, int y) { return (x >= 0 && x < n) && (y >= 0 && y < m); }

int main() {

  cin >> n >> m >> K;
  int sx, sy, ex, ey;
  cin >> sx >> sy >> ex >> ey;
  --sx, --sy, --ex, --ey;
  vector<string> grid(n);
  for (int i = 0; i < n; i++)
    cin >> grid[i];
  vector<vector<int>> dis(n, vector<int>(m, -1));
  dis[sx][sy] = 0;
  int dx[4] = {-1, 1, 0, 0};
  int dy[4] = {0, 0, 1, -1};
  queue<pair<int, int>> q;
  q.push({sx, sy});
  while (!q.empty()) {
    auto c = q.front();
    q.pop();
    auto cx = c.first, cy = c.second;
    // cout << cx << " " << cy << " " << dis[cx][cy] << endl;
    for (int i = 0; i < 4; i++) {
      for (int k = 1; k <= K; k++) {
        int nx = cx + (dx[i] * k);
        int ny = cy + (dy[i] * k);
        if (!issafe(nx, ny) || grid[nx][ny] == '@')
          break;
        else {
          if (dis[nx][ny] == -1) {
            dis[nx][ny] = 1 + dis[cx][cy];
            q.push({nx, ny});
          } else if (dis[nx][ny] >= dis[cx][cy] + 1) {
            dis[nx][ny] = 1 + dis[cx][cy];
          } else
            break;
        }
      }
    }
  }
  /*	for(int i = 0;i<n;i++)
          {
                  for(int j = 0;j <m;j++)
                          cout << dis[i][j] << " ";
                  cout << endl;
          }*/
  if (dis[ex][ey] == -1)
    cout << -1 << endl;
  else
    cout << dis[ex][ey] << endl;
  return 0;
}

Error: TLE

Fixed submission:

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

#define ll long long
const int MOD = 1e9 + 7;
ll mod(ll x) { return (x % MOD + MOD) % MOD; }
ll mul(ll a, ll b) { return mod(mod(a) * mod(b)); }

int n, m, K;

bool issafe(int x, int y) { return (x >= 0 && x < n) && (y >= 0 && y < m); }

int main() {

  cin >> n >> m >> K;
  int sx, sy, ex, ey;
  cin >> sx >> sy >> ex >> ey;
  --sx, --sy, --ex, --ey;
  vector<string> grid(n);
  for (int i = 0; i < n; i++)
    cin >> grid[i];
  vector<vector<int>> dis(n, vector<int>(m, -1));
  dis[sx][sy] = 0;
  int dx[4] = {-1, 1, 0, 0};
  int dy[4] = {0, 0, 1, -1};
  queue<pair<int, int>> q;
  q.push({sx, sy});
  while (!q.empty()) {
    auto c = q.front();
    q.pop();
    auto cx = c.first, cy = c.second;
    // cout << cx << " " << cy << " " << dis[cx][cy] << endl;
    for (int i = 0; i < 4; i++) {
      for (int k = 1; k <= K; k++) {
        int nx = cx + (dx[i] * k);
        int ny = cy + (dy[i] * k);
        if (!issafe(nx, ny) || grid[nx][ny] == '@')
          break;
        else {
          if (dis[nx][ny] == -1) {
            dis[nx][ny] = 1 + dis[cx][cy];
            q.push({nx, ny});
          }
          // else if(dis[nx][ny] > dis[cx][cy]+1) {
          //    	dis[nx][ny] = 1 + dis[cx][cy];
          // }
        }
      }
    }
  }
  /*	for(int i = 0;i<n;i++)
          {
                  for(int j = 0;j <m;j++)
                          cout << dis[i][j] << " ";
                  cout << endl;
          }*/
  if (dis[ex][ey] == -1)
    cout << -1 << endl;
  else
    cout << dis[ex][ey] << endl;
  return 0;
}