Problem p00243 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <cctype>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

using namespace std;

#define reps(i, f, n) for (int i = f; i < int(n); ++i)
#define rep(i, n) reps(i, 0, n)

typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;

const int INF = 1001001001;
const double EPS = 1e-10;

const int dy[] = {-1, 0, 1, 0};
const int dx[] = {0, -1, 0, 1};

int h, w;
int board[10][10];
int label[10][10];
vi color;
vvi G;

void labeling(int y, int x, int id) {
  label[y][x] = id;
  rep(i, 4) {
    int py = y + dy[i];
    int px = x + dx[i];
    if (py < 0 || h <= py || px < 0 || w <= px)
      continue;
    if (board[py][px] == board[y][x] && label[py][px] == -1)
      labeling(py, px, id);
  }
}

bool dfs(vi cand, int now, int depth) {
  if (depth == 0) {
    rep(i, cand.size()) if (cand[i] != 2) return false;
    return true;
  }

  vi tmp = cand;
  rep(c, 3) {
    if (c == now)
      continue;

    bool found = false;
    rep(i, cand.size()) {
      if (cand[i] == 1 && color[i] == c) {
        rep(j, G[i].size()) {
          if (cand[G[i][j]] == 0)
            cand[G[i][j]] = 1;
        }
        cand[i] = 2;
        found = true;
      }
    }
    if (found) {
      if (dfs(cand, c, depth - 1))
        return true;
      cand = tmp;
    }
  }
  return false;
}

int main() {
  while (scanf("%d%d", &w, &h), w) {
    rep(i, h) rep(j, w) {
      char c[5];
      scanf("%s", c);
      if (c[0] == 'R')
        board[i][j] = 0;
      else if (c[0] == 'G')
        board[i][j] = 1;
      else
        board[i][j] = 2;
    }

    rep(i, h) fill(label[i], label[i] + w, -1);

    color.clear();
    rep(i, h) rep(j, w) {
      if (label[i][j] == -1) {
        labeling(i, j, color.size());
        color.push_back(board[i][j]);
      }
    }

    G.assign(color.size(), vi());
    rep(i, h) rep(j, w) {
      rep(k, 4) {
        int py = i + dy[k];
        int px = j + dx[k];
        if (py < 0 || h <= py || px < 0 || w <= px)
          continue;
        if (label[i][j] != label[py][px]) {
          G[label[i][j]].push_back(label[py][px]);
          G[label[py][px]].push_back(label[i][j]);
        }
      }
    }

    rep(i, G.size()) {
      sort(G[i].begin(), G[i].end());
      G[i].erase(unique(G[i].begin(), G[i].end()), G[i].end());
    }

    for (int depth = 1;; ++depth) {
      vi cand(G.size(), 0);
      rep(i, G[0].size()) cand[G[0][i]] = 1;
      cand[0] = 2;

      if (dfs(cand, color[0], depth)) {
        printf("%d\n", depth);
        break;
      }
    }
  }
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cctype>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

using namespace std;

#define reps(i, f, n) for (int i = f; i < int(n); ++i)
#define rep(i, n) reps(i, 0, n)

typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;

const int INF = 1001001001;
const double EPS = 1e-10;

const int dy[] = {-1, 0, 1, 0};
const int dx[] = {0, -1, 0, 1};

int h, w;
int board[10][10];
int label[10][10];
vi color;
vvi G;

void labeling(int y, int x, int id) {
  label[y][x] = id;
  rep(i, 4) {
    int py = y + dy[i];
    int px = x + dx[i];
    if (py < 0 || h <= py || px < 0 || w <= px)
      continue;
    if (board[py][px] == board[y][x] && label[py][px] == -1)
      labeling(py, px, id);
  }
}

bool dfs(vi cand, int now, int depth) {
  if (depth == 0) {
    rep(i, cand.size()) if (cand[i] != 2) return false;
    return true;
  }

  vi tmp = cand;
  rep(c, 3) {
    if (c == now)
      continue;

    bool found = false;
    rep(i, cand.size()) {
      if (cand[i] == 1 && color[i] == c) {
        rep(j, G[i].size()) {
          if (cand[G[i][j]] == 0)
            cand[G[i][j]] = 1;
        }
        cand[i] = 2;
        found = true;
      }
    }
    if (found) {
      if (dfs(cand, c, depth - 1))
        return true;
      cand = tmp;
    }
  }
  return false;
}

int main() {
  while (scanf("%d%d", &w, &h), w) {
    rep(i, h) rep(j, w) {
      char c[5];
      scanf("%s", c);
      if (c[0] == 'R')
        board[i][j] = 0;
      else if (c[0] == 'G')
        board[i][j] = 1;
      else
        board[i][j] = 2;
    }

    rep(i, h) fill(label[i], label[i] + w, -1);

    color.clear();
    rep(i, h) rep(j, w) {
      if (label[i][j] == -1) {
        labeling(i, j, color.size());
        color.push_back(board[i][j]);
      }
    }

    G.assign(color.size(), vi());
    rep(i, h) rep(j, w) {
      rep(k, 4) {
        int py = i + dy[k];
        int px = j + dx[k];
        if (py < 0 || h <= py || px < 0 || w <= px)
          continue;
        if (label[i][j] != label[py][px]) {
          G[label[i][j]].push_back(label[py][px]);
          G[label[py][px]].push_back(label[i][j]);
        }
      }
    }

    rep(i, G.size()) {
      sort(G[i].begin(), G[i].end());
      G[i].erase(unique(G[i].begin(), G[i].end()), G[i].end());
    }

    for (int depth = 0;; ++depth) {
      vi cand(G.size(), 0);
      rep(i, G[0].size()) cand[G[0][i]] = 1;
      cand[0] = 2;

      if (dfs(cand, color[0], depth)) {
        printf("%d\n", depth);
        break;
      }
    }
  }
  return 0;
}