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

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
using namespace std;

struct Dog {
  int h, w;
  int dir;
};

Dog dog, tmp;

int h, w;
long long l;
int dh[4] = {-1, 0, 1, 0};
int dw[4] = {0, 1, 0, -1};
char d[4] = {'N', 'E', 'S', 'W'};
int brd[100][100];

int main() {
  while (true) {
    cin >> h >> w >> l;
    if (h == 0 && w == 0 && l == 0)
      break;
    rep(i, h) {
      string str;
      cin >> str;
      rep(j, w) {
        if (str[j] == '#')
          brd[i][j] = 1;
        else
          brd[i][j] = 0;
        if (str[j] == 'N') {
          dog.h = i;
          dog.w = j;
          dog.dir = 0;
        }
        if (str[j] == 'E') {
          dog.h = i;
          dog.w = j;
          dog.dir = 1;
        }
        if (str[j] == 'W') {
          dog.h = i;
          dog.w = j;
          dog.dir = 3;
        }
        if (str[j] == 'S') {
          dog.h = i;
          dog.w = j;
          dog.dir = 2;
        }
      }
    }
    bool end = false;
    for (int i = 1; i <= 100000; i++) {
      while (true) {
        int hh = dog.h + dh[dog.dir], ww = dog.w + dw[dog.dir];
        if (0 > hh || hh >= h || 0 > ww || ww >= w || brd[hh][ww] == 1) {
          dog.dir = (dog.dir + 1) % 4;
          continue;
        }
        dog.h = hh;
        dog.w = ww;
        break;
      }
      if (l == i) {
        end = true;
        cout << dog.h + 1 << " " << dog.w + 1 << " " << d[dog.dir] << endl;
        break;
      }
    }
    if (end)
      continue;
    tmp.h = dog.h;
    tmp.w = dog.w;
    tmp.dir = dog.dir;
    l -= 100000;
    int cnt = 0;
    while (true) {
      cnt++;
      while (true) {
        int hh = dog.h + dh[dog.dir], ww = dog.w + dw[dog.dir];
        if (0 > hh || hh >= h || 0 > ww || ww >= w || brd[hh][ww] == 1) {
          dog.dir = (dog.dir + 1) % 4;
          continue;
        }
        dog.h = hh;
        dog.w = ww;
        break;
      }
      if (dog.h == tmp.h && dog.w == tmp.w && dog.dir == tmp.dir)
        break;
    }
    l %= cnt;
    for (int i = 0;; i++) {
      if (l == i) {
        cout << dog.h + 1 << " " << dog.w + 1 << " " << d[dog.dir] << endl;
        break;
      }
      while (true) {
        int hh = dog.h + dh[dog.dir], ww = dog.w + dw[dog.dir];
        if (0 > hh || hh >= h || 0 > ww || ww >= w || brd[hh][ww] == 1) {
          dog.dir = (dog.dir + 1) % 4;
          continue;
        }
        dog.h = hh;
        dog.w = ww;
        break;
      }
    }
  }
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < n; i++)
using namespace std;

struct Dog {
  int h, w;
  int dir;
};

Dog dog, tmp;

int h, w;
long long l;
int dh[4] = {-1, 0, 1, 0};
int dw[4] = {0, 1, 0, -1};
char d[4] = {'N', 'E', 'S', 'W'};
int brd[100][100];

int main() {
  while (true) {
    cin >> h >> w >> l;
    if (h == 0 && w == 0 && l == 0)
      break;
    rep(i, h) {
      string str;
      cin >> str;
      rep(j, w) {
        if (str[j] == '#')
          brd[i][j] = 1;
        else
          brd[i][j] = 0;
        if (str[j] == 'N') {
          dog.h = i;
          dog.w = j;
          dog.dir = 0;
        }
        if (str[j] == 'E') {
          dog.h = i;
          dog.w = j;
          dog.dir = 1;
        }
        if (str[j] == 'W') {
          dog.h = i;
          dog.w = j;
          dog.dir = 3;
        }
        if (str[j] == 'S') {
          dog.h = i;
          dog.w = j;
          dog.dir = 2;
        }
      }
    }
    bool end = false;
    for (int i = 1; i <= 100000; i++) {
      while (true) {
        int hh = dog.h + dh[dog.dir], ww = dog.w + dw[dog.dir];
        if (0 > hh || hh >= h || 0 > ww || ww >= w || brd[hh][ww] == 1) {
          dog.dir = (dog.dir + 1) % 4;
          continue;
        }
        dog.h = hh;
        dog.w = ww;
        break;
      }
      if (l == i) {
        end = true;
        cout << dog.h + 1 << " " << dog.w + 1 << " " << d[dog.dir] << endl;
        break;
      }
    }
    if (end)
      continue;
    tmp.h = dog.h;
    tmp.w = dog.w;
    tmp.dir = dog.dir;
    l -= 100000;
    int cnt = 0;
    while (true) {
      cnt++;
      while (true) {
        int hh = dog.h + dh[dog.dir], ww = dog.w + dw[dog.dir];
        if (0 > hh || hh >= h || 0 > ww || ww >= w || brd[hh][ww] == 1) {
          dog.dir = (dog.dir + 1) % 4;
          continue;
        }
        dog.h = hh;
        dog.w = ww;
        break;
      }
      if (dog.h == tmp.h && dog.w == tmp.w && dog.dir == tmp.dir)
        break;
    }
    l %= cnt;
    for (int i = 1;; i++) {
      while (true) {
        int hh = dog.h + dh[dog.dir], ww = dog.w + dw[dog.dir];
        if (0 > hh || hh >= h || 0 > ww || ww >= w || brd[hh][ww] == 1) {
          dog.dir = (dog.dir + 1) % 4;
          continue;
        }
        dog.h = hh;
        dog.w = ww;
        break;
      }
      if (l == i) {
        cout << dog.h + 1 << " " << dog.w + 1 << " " << d[dog.dir] << endl;
        break;
      }
    }
  }
}