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

#include <cstring>
#include <iostream>
#include <string>
using namespace std;

typedef long long ll;

int W, H;
ll L;
int dx[] = {0, 1, 0, -1};
int dy[] = {-1, 0, 1, 0};

char DtoS[] = {'N', 'E', 'S', 'W'};
bool visited[100][100][4];
string field[100];
int table[40005];

pair<int, int> bfs(int sx, int sy, int sd) {
  memset(visited, 0, sizeof(visited));
  for (int i = 0; i < 40000; i++)
    table[i] = -1;

  int x = sx, y = sy, d = sd;
  int cost = 0;

  while (1) {

    if (visited[x][y][d])
      break;
    visited[x][y][d] = true;

    int h = d * 10000 + y * 100 + x;

    table[h] = cost;
    cost++;

    for (int i = 0; i < 4; i++) {
      int td = (d + i) % 4;
      int tx = x + dx[td];
      int ty = y + dy[td];

      if (tx < 0 || ty < 0 || tx >= W || ty >= H)
        continue;
      if (field[ty][tx] == '#')
        continue;

      d = td;

      break;
    }

    x += dx[d];
    y += dy[d];
  }

  int ret = table[d * 10000 + y * 100 + x];

  return make_pair(cost, ret);
}

int solve() {
  pair<int, int> bfsres;

  for (int i = 0; i < H; i++)
    for (int j = 0; j < W; j++)
      for (int k = 0; k < 4; k++) {
        if (DtoS[k] == field[i][j])
          bfsres = bfs(j, i, k);
      }

  ll length = bfsres.first;
  ll bias = bfsres.second;
  ll loopL = length - bias;
  ll pos = L;

  if (L >= bias)
    pos = (L - bias) % loopL + bias;

  int res = 0;
  for (int i = 0; i < 40000; i++)
    if (table[i] == pos)
      res = i;

  return res;
}

int main() {
  while (cin >> H >> W >> L, (W || H || L)) {
    for (int i = 0; i < H; i++)
      cin >> field[i];

    int res = solve();
    cout << ((res / 100) % 100 + 1) << " " << (res % 100) + 1 << " "
         << DtoS[res / 10000] << endl;
  }
}


Error: TLE

Fixed submission:

#include <cstring>
#include <iostream>
#include <string>
using namespace std;

int W, H, L;
int dx[] = {0, 1, 0, -1};
int dy[] = {-1, 0, 1, 0};

char DtoS[] = {'N', 'E', 'S', 'W'};
bool visited[100][100][4];
string field[100];
int table[40005];

pair<int, int> bfs(int sx, int sy, int sd) {
  memset(visited, 0, sizeof(visited));
  memset(table, 0, sizeof(table));

  int x = sx, y = sy, d = sd, tmp = sd;
  int cost = 0;

  while (1) {

    if (visited[x][y][d])
      break;
    visited[x][y][d] = true;

    int h = d * 10000 + y * 100 + x;

    table[h] = cost;
    cost++;

    for (int i = 0; i < 4; i++) {
      int td = (d + i) % 4;
      int tx = x + dx[td];
      int ty = y + dy[td];

      if (tx < 0 || ty < 0 || tx >= W || ty >= H)
        continue;
      if (field[ty][tx] == '#')
        continue;

      d = td;

      break;
    }

    x += dx[d];
    y += dy[d];
  }

  int ret = table[d * 10000 + y * 100 + x];

  return make_pair(cost, ret);
}

int solve() {
  pair<int, int> bfsres;

  for (int i = 0; i < H; i++)
    for (int j = 0; j < W; j++)
      for (int k = 0; k < 4; k++) {
        if (DtoS[k] == field[i][j])
          bfsres = bfs(j, i, k);
      }

  int length = bfsres.first;
  int bias = bfsres.second;
  int loopL = length - bias;

  if (L < bias)
    return table[L];
  int pos = (L - bias) % loopL + bias;

  int res = 0;
  for (int i = 0; i < 40000; i++)
    if (table[i] == pos)
      res = i;

  return res;
}

int main() {
  while (cin >> H >> W >> L, (W || H || L)) {
    for (int i = 0; i < H; i++)
      cin >> field[i];

    int res = solve();
    cout << ((res / 100) % 100 + 1) << " " << (res % 100) + 1 << " "
         << DtoS[res / 10000] << endl;
  }
}