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

#include <bits/stdc++.h>
using namespace std;
int xv[] = {0, 1, 1, 1, 0, -1, -1, -1}, yv[] = {-1, -1, 0, 1, 1, 1, 0, -1};

int main() {
  int n, m, ans = 0;
  char in;
  pair<int, int> lc, go;
  int lv;
  cin >> n >> m;
  vector<vector<int>> mp;
  mp = vector<vector<int>>(n + 2, vector<int>(m + 2, -1));
  vector<vector<vector<int>>> bl;
  bl = vector<vector<vector<int>>>(
      n + 2, vector<vector<int>>(m + 2, vector<int>(4, 0)));

  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      cin >> in;
      if (in == 'G') {
        mp[i][j] = 0;
        go = make_pair(i, j);
      } else if (in == '.') {
        mp[i][j] = 0;
      } else if (in == '^') {
        mp[i][j] = 0;
        lv = 0;
        lc = make_pair(i, j);
        bl[i][j][lv]++;
      } else if (in == '>') {
        mp[i][j] = 0;
        lv = 1;
        lc = make_pair(i, j);
        bl[i][j][lv]++;
      } else if (in == 'v') {
        mp[i][j] = 0;
        lv = 2;
        lc = make_pair(i, j);
        bl[i][j][lv]++;
      } else if (in == '<') {
        mp[i][j] = 0;
        lv = 3;
        lc = make_pair(i, j);
        bl[i][j][lv]++;
      }
    }
  }
  int r, c;
  while (1) {
    r = lc.first;
    c = lc.second;
    if (mp[r + yv[(2 * lv + 2) % 8]][c + xv[(2 * lv + 2) % 8]] == -1 &&
        mp[r + yv[2 * lv]][c + xv[2 * lv]] == 0) {
      if (bl[r + yv[2 * lv]][c + xv[2 * lv]][lv] == 4) {
        cout << "-1" << endl;
        return 0;
      }
      bl[r + yv[2 * lv]][c + xv[2 * lv]][lv]++;
      lc = make_pair(r + yv[2 * lv], c + xv[2 * lv]);
    } else if (mp[r + yv[(2 * lv + 2) % 8]][c + xv[(2 * lv + 2) % 8]] == 0 &&
               mp[r + yv[(2 * lv + 3) % 8]][c + xv[(2 * lv + 3) % 8]] == -1) {
      lv = (lv + 1) % 4;
      if (bl[r][c][lv] == 4) {
        cout << "-1" << endl;
        return 0;
      }
      bl[r][c][lv]++;
      lc = make_pair(r + yv[2 * lv], c + xv[2 * lv]);
      if (bl[lc.first][lc.second][lv] == 4) {
        cout << "-1" << endl;
        return 0;
      }
      bl[lc.first][lc.second][lv]++;
    } else if (mp[r + yv[2 * lv]][c + xv[2 * lv]] == -1) {
      lv = (lv + 3) % 4;
      if (bl[r][c][lv] == 4) {
        cout << "-1" << endl;
        return 0;
      }
      bl[r][c][lv]++;
    }
    if (go == lc) {
      for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
          if (bl[i][j][0] || bl[i][j][1] || bl[i][j][2] || bl[i][j][3]) {
            ans++;
          }
        }
      }
      cout << ans << endl;
      return 0;
    }
  }
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
int xv[] = {0, 1, 1, 1, 0, -1, -1, -1}, yv[] = {-1, -1, 0, 1, 1, 1, 0, -1};

int main() {
  int n, m, ans = 0;
  char in;
  pair<int, int> lc, go;
  int lv;
  cin >> n >> m;
  vector<vector<int>> mp;
  mp = vector<vector<int>>(n + 2, vector<int>(m + 2, -1));
  vector<vector<vector<int>>> bl;
  bl = vector<vector<vector<int>>>(
      n + 2, vector<vector<int>>(m + 2, vector<int>(4, 0)));

  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      cin >> in;
      if (in == 'G') {
        mp[i][j] = 0;
        go = make_pair(i, j);
      } else if (in == '.') {
        mp[i][j] = 0;
      } else if (in == '^') {
        mp[i][j] = 0;
        lv = 0;
        lc = make_pair(i, j);
        bl[i][j][lv]++;
      } else if (in == '>') {
        mp[i][j] = 0;
        lv = 1;
        lc = make_pair(i, j);
        bl[i][j][lv]++;
      } else if (in == 'v') {
        mp[i][j] = 0;
        lv = 2;
        lc = make_pair(i, j);
        bl[i][j][lv]++;
      } else if (in == '<') {
        mp[i][j] = 0;
        lv = 3;
        lc = make_pair(i, j);
        bl[i][j][lv]++;
      }
    }
  }
  int r, c;
  while (1) {
    r = lc.first;
    c = lc.second;
    if (mp[r + yv[(2 * lv + 2) % 8]][c + xv[(2 * lv + 2) % 8]] == -1 &&
        mp[r + yv[2 * lv]][c + xv[2 * lv]] == 0) {
      if (bl[r + yv[2 * lv]][c + xv[2 * lv]][lv] == 4) {
        cout << "-1" << endl;
        return 0;
      }
      bl[r + yv[2 * lv]][c + xv[2 * lv]][lv] = true;
      lc = make_pair(r + yv[2 * lv], c + xv[2 * lv]);
    } else if (mp[r + yv[(2 * lv + 2) % 8]][c + xv[(2 * lv + 2) % 8]] == 0 &&
               mp[r + yv[(2 * lv + 3) % 8]][c + xv[(2 * lv + 3) % 8]] == -1) {
      lv = (lv + 1) % 4;
      if (bl[r][c][lv] == 4) {
        cout << "-1" << endl;
        return 0;
      }
      bl[r][c][lv] = true;
      lc = make_pair(r + yv[2 * lv], c + xv[2 * lv]);
      if (bl[lc.first][lc.second][lv] == 4) {
        cout << "-1" << endl;
        return 0;
      }
      bl[lc.first][lc.second][lv] = true;
    } else if (mp[r + yv[2 * lv]][c + xv[2 * lv]] == -1) {
      lv = (lv + 3) % 4;
      if (bl[r][c][lv] == 4) {
        cout << "-1" << endl;
        return 0;
      }
      bl[r][c][lv] = true;
    }
    if (go == lc) {
      for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
          if (bl[i][j][0] || bl[i][j][1] || bl[i][j][2] || bl[i][j][3]) {
            ans++;
          }
        }
      }
      cout << ans << endl;
      return 0;
    }
  }
}