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

#include <iostream>
#include <stack>
using namespace std;
int main() {
  int m;
  int n;
  int b;
  int c;
  int h; // 現在の割った氷
  int i; // 割った氷の最高
  int j;
  int k;
  while (cin >> m >> n) {
    if (m == 0 && n == 0) {
      break;
    }
    int a[n][m];
    int g[n][m]; // 氷が残っているか
    b = 0;
    while (b < n) {
      c = 0;
      while (c < m) {
        cin >> a[b][c];
        g[b][c] = a[b][c];
        c = c + 1;
      }
      b = b + 1;
    }
    stack<int> d; // nの値
    stack<int> e; // mの値
    stack<int> f; // 次進む経路0上1下2左3右
    i = 0;
    b = 0;
    while (b < n) {
      c = 0;
      while (c < m) {
        d.push(b);
        e.push(c);
        f.push(0);
        h = 1;
        k = 0;
        g[b][c] = 0;
        while (h != 0) {
          if (a[b][c] == 0) {
            break;
          }
          if (f.top() == 0 && d.top() != 0 && g[d.top() - 1][e.top()] == 1 &&
              k == 0) {
            d.push(d.top() - 1);
            e.push(e.top());
            f.push(0);
            g[d.top()][e.top()] = 0;
            h = h + 1;
          } else if (f.top() == 1 && d.top() != n &&
                     g[d.top() + 1][e.top()] == 1 && k == 0) {
            d.push(d.top() + 1);
            e.push(e.top());
            f.push(0);
            g[d.top()][e.top()] = 0;
            h = h + 1;
          } else if (f.top() == 2 && e.top() != 0 &&
                     g[d.top()][e.top() - 1] == 1 && k == 0) {
            d.push(d.top());
            e.push(e.top() - 1);
            f.push(0);
            g[d.top()][e.top()] = 0;
            h = h + 1;
          } else if (f.top() == 3 && e.top() != m &&
                     g[d.top()][e.top() + 1] == 1 && k == 0) {
            d.push(d.top());
            e.push(e.top() + 1);
            f.push(0);
            g[d.top()][e.top()] = 0;
            h = h + 1;
          } else {
            k = 0;
            if (f.top() != 3) {
              j = f.top();
              f.pop();
              f.push(j + 1);
            } else {
              g[d.top()][e.top()] = 1;
              h = h - 1;
              d.pop();
              e.pop();
              f.pop();
              k = 1;
            }
          }
          if (h > i) {
            i = h;
          }
        }
        c = c + 1;
      }
      b = b + 1;
    }
    cout << i << endl;
  }
}

Error: TLE

Fixed submission:

#include <iostream>
#include <stack>
using namespace std;
int main() {
  int m;
  int n;
  int b;
  int c;
  int h; // 現在の割った氷
  int i; // 割った氷の最高
  int j;
  int k;
  while (cin >> m >> n) {
    if (m == 0 && n == 0) {
      break;
    }
    int a[n][m];
    int g[n][m]; // 氷が残っているか
    b = 0;
    while (b < n) {
      c = 0;
      while (c < m) {
        cin >> a[b][c];
        g[b][c] = a[b][c];
        c = c + 1;
      }
      b = b + 1;
    }
    stack<int> d; // nの値
    stack<int> e; // mの値
    stack<int> f; // 次進む経路0上1下2左3右
    i = 0;
    b = 0;
    while (b < n) {
      c = 0;
      while (c < m) {
        d.push(b);
        e.push(c);
        f.push(1);
        h = 1;
        k = 0;
        while (h != 0) {
          if (f.top() == 0 && d.top() != 0 && g[d.top() - 1][e.top()] == 1 &&
              k == 0) {
            d.push(d.top() - 1);
            e.push(e.top());
            f.push(0);
            g[d.top()][e.top()] = 0;
            h = h + 1;
          } else if (f.top() == 1 && d.top() != n &&
                     g[d.top() + 1][e.top()] == 1 && k == 0) {
            d.push(d.top() + 1);
            e.push(e.top());
            f.push(0);
            g[d.top()][e.top()] = 0;
            h = h + 1;
          } else if (f.top() == 2 && d.top() != 0 &&
                     g[d.top()][e.top() - 1] == 1 && k == 0) {
            d.push(d.top());
            e.push(e.top() - 1);
            f.push(0);
            g[d.top()][e.top()] = 0;
            h = h + 1;
          } else if (f.top() == 3 && d.top() != m &&
                     g[d.top()][e.top() + 1] == 1 && k == 0) {
            d.push(d.top());
            e.push(e.top() + 1);
            f.push(0);
            g[d.top()][e.top()] = 0;
            h = h + 1;
          } else {
            k = 0;
            if (f.top() != 3) {
              j = f.top();
              f.pop();
              f.push(j + 1);
            } else {
              g[d.top()][e.top()] = 1;
              h = h - 1;
              d.pop();
              e.pop();
              f.pop();
              k = 1;
            }
          }
          if (h > i) {
            i = h;
          }
        }
        c = c + 1;
      }
      b = b + 1;
    }
    cout << i << endl;
  }
}