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

// 今向いている方向にとっての左から始めて、時計回りに壁を探して、最初にみつけた壁の方向に進む
#include <algorithm>
#include <cmath>
#include <fstream>
#include <iostream>
#include <queue>
#include <utility>
#include <vector>
using namespace std;
struct Direction {
  bool u, d, r, l;
};

void dump_Direction(Direction di) {
  cout << "[" << di.u << di.r << di.d << di.l << "]";
}

int main() {
  // ifstream cin("../test.txt");
  Direction g[5][5];
  for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
      g[i][j].u = false;
      g[i][j].d = false;
      g[i][j].r = false;
      g[i][j].l = false;
    }
  }
  for (int i = 0; i < 9; i++) {
    string s;
    cin >> s;
    if (i % 2 == 0) {
      for (int j = 0; j < 4; j++) {
        int k = i / 2;
        g[k][j].r = (s[j] == '1');
        g[k][j + 1].l = (s[j] == '1');
      }
    } else {
      for (int j = 0; j < 5; j++) {
        int k = i / 2;
        g[k][j].d = (s[j] == '1');
        g[k + 1][j].u = (s[j] == '1');
      }
    }
  }
  // 表示用
  // for (int i = 0; i < 5; i++) {
  //   for (int  j = 0; j < 5; j++) {
  //     dump_Direction(g[i][j]);
  //   }
  //   cout << endl;
  // }

  int x = 0;
  int y = 0;
  int d = 0; // 0: u, 1: r, 2: d, 3: l
  int dx[] = {0, 1, 0, -1};
  int dy[] = {-1, 0, 1, 0};
  char c[] = {'U', 'R', 'D', 'L'};
  while (true) {
    bool dir[] = {g[y][x].u, g[y][x].r, g[y][x].d, g[y][x].l};
    // dump_Direction(g[y][x]);
    int i = 0;
    for (; i < 4; i++) {
      if (dir[(i + d) % 4])
        break;
    }
    int j = (i + d) % 4;
    // cout << j;
    x += dx[j];
    y += dy[j];
    cout << c[j];
    d = (j + 3) % 4;
    if (!(x | y))
      break;
  }
  cout << endl;
}

Error: TLE

Fixed submission:

// 今向いている方向にとっての左から始めて、時計回りに壁を探して、最初にみつけた壁の方向に進む
#include <algorithm>
#include <cmath>
#include <fstream>
#include <iostream>
#include <queue>
#include <utility>
#include <vector>
using namespace std;
struct Direction {
  bool u, d, r, l;
};

void dump_Direction(Direction di) {
  cout << "[" << di.u << di.r << di.d << di.l << "]";
}

int main() {
  // ifstream cin("../test.txt");
  Direction g[5][5];
  string s;
  for (int i = 0; i < 9; i++) {
    getline(cin, s);
    if (i % 2 == 0) {
      for (int j = 0; j < 4; j++) {
        int k = i / 2;
        g[k][j].r = (s[j] == '1');
        g[k][j + 1].l = (s[j] == '1');
      }
    } else {
      for (int j = 0; j < 5; j++) {
        int k = i / 2;
        g[k][j].d = (s[j] == '1');
        g[k + 1][j].u = (s[j] == '1');
      }
    }
  }
  // 表示用
  // for (int i = 0; i < 5; i++) {
  //   for (int  j = 0; j < 5; j++) {
  //     dump_Direction(g[i][j]);
  //   }
  //   cout << endl;
  // }

  int x = 0;
  int y = 0;
  int d = 0; // 0: u, 1: r, 2: d, 3: l
  int dx[] = {0, 1, 0, -1};
  int dy[] = {-1, 0, 1, 0};
  char c[] = {'U', 'R', 'D', 'L'};
  while (true) {
    bool dir[] = {g[y][x].u, g[y][x].r, g[y][x].d, g[y][x].l};
    // dump_Direction(g[y][x]);
    int i = 0;
    for (; i < 4; i++) {
      if (dir[(i + d) % 4])
        break;
    }
    int j = (i + d) % 4;
    // cout << j;
    x += dx[j];
    y += dy[j];
    cout << c[j];
    d = (j + 3) % 4;
    if (!(x | y))
      break;
  }
  cout << endl;
}