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

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctype.h>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

int w, h;
long long int l;
int tesu[101][101][4];
char meiro[101][101];
vector<pair<pair<int, int>, char>> step;

int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
char direction[4] = {'N', 'E', 'S', 'W'};

void solve(int x, int y, int nowface, long long int stepnum) {
  // cout << stepnum << " " << x << " " << y << " " << direction[nowface] <<
  // endl;
  if (stepnum == l) {
    cout << x << " " << y << " " << direction[nowface] << endl;
    return;
  }
  step.push_back(make_pair(make_pair(x, y), direction[nowface]));
  int nx = x + dx[nowface];
  int ny = y + dy[nowface];
  while (nx < 1 || ny < 1 || nx > h || ny > w || meiro[nx][ny] == '#') {
    nowface = (nowface + 1) % 4;
    nx = x + dx[nowface];
    ny = y + dy[nowface];
    // cout << x << " " << y << " " <<  nx << " " << ny << endl;
  }
  if (tesu[nx][ny][nowface] == -1) {
    tesu[nx][ny][nowface] = stepnum + 1;
    solve(nx, ny, nowface, stepnum + 1);
  } else {
    long long int tmp = stepnum + 1 - tesu[nx][ny][nowface];
    // cout << tesu[nx][ny][nowface] << endl;
    pair<pair<int, int>, char> ans =
        step[tesu[nx][ny][nowface] + (l - tesu[nx][ny][nowface]) % tmp];
    cout << (ans.first).first << " " << (ans.first).second << " " << ans.second
         << endl;
  }
  return;
}

int main() {
  while (1) {
    cin >> h >> w >> l;
    int sx, sy;
    if (w == 0 && h == 0 && l == 0)
      break;
    step.clear();
    for (int i = 1; i < h + 1; i++) {
      for (int j = 1; j < w + 1; j++) {
        cin >> meiro[i][j];
        if (meiro[i][j] != '#' && meiro[i][j] != '.') {
          sx = i;
          sy = j;
        }
        for (int k = 0; k < 4; k++) {
          tesu[i][j][k] = -1;
        }
      }
    }
    if (meiro[sx][sy] == 'N')
      solve(sx, sy, 0, 0);
    else if (meiro[sx][sy] == 'E')
      solve(sx, sy, 1, 0);
    else if (meiro[sx][sy] == 'S')
      solve(sx, sy, 2, 0);
    else
      solve(sx, sy, 3, 0);
  }
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctype.h>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

using namespace std;

int w, h;
long long int l;
int tesu[101][101][4];
char meiro[101][101];

int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
char direction[4] = {'N', 'E', 'S', 'W'};

void solve(int x, int y, int nowface, long long int stepnum) {
  // cout << stepnum << " " << x << " " << y << " " << direction[nowface] <<
  // endl;
  if (stepnum == l) {
    cout << x << " " << y << " " << direction[nowface] << endl;
    return;
  }
  int nx = x + dx[nowface];
  int ny = y + dy[nowface];
  while (nx < 1 || ny < 1 || nx > h || ny > w || meiro[nx][ny] == '#') {
    nowface = (nowface + 1) % 4;
    nx = x + dx[nowface];
    ny = y + dy[nowface];
    // cout << x << " " << y << " " <<  nx << " " << ny << endl;
  }
  if (tesu[nx][ny][nowface] == -1) {
    tesu[nx][ny][nowface] = stepnum + 1;
    solve(nx, ny, nowface, stepnum + 1);
  } else {
    long long int tmp = stepnum + 1 - tesu[nx][ny][nowface];
    // cout << tesu[nx][ny][nowface] << endl;
    solve(nx, ny, nowface, stepnum + ((l - stepnum) / tmp) * tmp + 1);
  }
  return;
}

int main() {
  while (1) {
    cin >> h >> w >> l;
    int sx, sy;
    if (w == 0 && h == 0 && l == 0)
      break;
    for (int i = 1; i < h + 1; i++) {
      for (int j = 1; j < w + 1; j++) {
        cin >> meiro[i][j];
        if (meiro[i][j] != '#' && meiro[i][j] != '.') {
          sx = i;
          sy = j;
        }
        for (int k = 0; k < 4; k++) {
          tesu[i][j][k] = -1;
        }
      }
    }
    if (meiro[sx][sy] == 'N')
      solve(sx, sy, 0, 0);
    else if (meiro[sx][sy] == 'E')
      solve(sx, sy, 1, 0);
    else if (meiro[sx][sy] == 'S')
      solve(sx, sy, 2, 0);
    else
      solve(sx, sy, 3, 0);
  }
  return 0;
}