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

#include <bits/stdc++.h>
using namespace std;

#define rep(i, x, y) for (int i = (x); i < (y); ++i)
#define debug(x) #x << "=" << (x)

#ifdef DEBUG
#define _GLIBCXX_DEBUG
#define dump(x) std::cerr << debug(x) << " (L:" << __LINE__ << ")" << std::endl
#else
#define dump(x)
#endif

typedef long long int ll;
typedef pair<int, int> pii;
// template<typename T> using vec=std::vector<T>;

const int inf = 1 << 30;
const long long int infll = 1LL << 58;
const double eps = 1e-9;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}

int x, y, ans, min_res = 0;

inline vector<pii> fill_cells(vector<vector<char>> &cells, char color) {
  vector<pii> res;
  queue<pii> que;
  que.push(make_pair(0, 0));
  char prev_color = cells[0][0];
  cells[0][0] = color;
  while (!que.empty()) {
    pii p = que.front();
    que.pop();
    res.push_back(p);
    for (int i = 0; i < 4; ++i) {
      int ny = p.first + dy[i], nx = p.second + dx[i];
      if (ny < 0 or y <= ny or nx < 0 or x <= nx)
        continue;
      if (cells[ny][nx] != prev_color)
        continue;
      que.push(make_pair(ny, nx));
      cells[ny][nx] = color;
    }
  }

  return move(res);
}

inline void dfs(int num, vector<vector<char>> &cells) {
  if (num > min_res)
    return;
  for (int i = 0; i < 3; ++i) {
    if (num >= ans)
      return;
    if (cells[0][0] == "BGR"[i])
      continue;

    char prev_color = cells[0][0];
    vector<pii> ps = fill_cells(cells, "BGR"[i]);

    if (ps.size() == x * y)
      ans = num;
    else
      dfs(num + 1, cells);
    for (const pii &p : ps)
      cells[p.first][p.second] = prev_color;
  }
}

void solve() {
  while (true) {
    cin >> x >> y;
    if (x == 0 and y == 0)
      break;

    vector<vector<char>> cells(y, vector<char>(x));
    rep(i, 0, y) rep(j, 0, x) cin >> cells[i][j];

    ans = inf;
    min_res = 0;
    while (ans == inf) {
      dfs(0, cells);
      ++min_res;
    }

    cout << ans << endl;
  }
}

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  solve();
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>
using namespace std;

#define rep(i, x, y) for (int i = (x); i < (y); ++i)
#define debug(x) #x << "=" << (x)

#ifdef DEBUG
#define _GLIBCXX_DEBUG
#define dump(x) std::cerr << debug(x) << " (L:" << __LINE__ << ")" << std::endl
#else
#define dump(x)
#endif

typedef long long int ll;
typedef pair<int, int> pii;
// template<typename T> using vec=std::vector<T>;

const int inf = 1 << 30;
const long long int infll = 1LL << 58;
const double eps = 1e-9;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};

template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  os << "[";
  for (const auto &v : vec) {
    os << v << ",";
  }
  os << "]";
  return os;
}

int x, y, ans;

inline vector<pii> fill_cells(vector<vector<char>> &cells, char color) {
  vector<pii> res;
  queue<pii> que;
  que.push(make_pair(0, 0));
  char prev_color = cells[0][0];
  cells[0][0] = color;
  while (!que.empty()) {
    pii p = que.front();
    que.pop();
    res.push_back(p);
    for (int i = 0; i < 4; ++i) {
      int ny = p.first + dy[i], nx = p.second + dx[i];
      if (ny < 0 or y <= ny or nx < 0 or x <= nx)
        continue;
      if (cells[ny][nx] != prev_color)
        continue;
      que.push(make_pair(ny, nx));
      cells[ny][nx] = color;
    }
  }

  return move(res);
}

inline void dfs(int num, vector<vector<char>> &cells) {
  for (int i = 0; i < 3; ++i) {
    if (num >= ans)
      return;
    if (cells[0][0] == "RBG"[i])
      continue;

    char prev_color = cells[0][0];
    vector<pii> ps = fill_cells(cells, "RBG"[i]);

    if (ps.size() == x * y)
      ans = num;
    else
      dfs(num + 1, cells);
    for (const pii &p : ps)
      cells[p.first][p.second] = prev_color;
  }
}

void solve() {
  while (true) {
    cin >> x >> y;
    if (x == 0 and y == 0)
      break;
    ans = x * y;

    vector<vector<char>> cells(y, vector<char>(x));
    rep(i, 0, y) rep(j, 0, x) cin >> cells[i][j];

    dfs(0, cells);

    cout << ans << endl;
  }
}

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);
  solve();
  return 0;
}