Problem p00243 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;
const int INF = 1 << 25;
int ans;
int b[10][10];
int W, H;

int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
bool in(int x, int y) { return 0 <= x && x < W && 0 <= y && y < H; }

void copy_board(int dst[10][10], int src[10][10]) {
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      dst[i][j] = src[i][j];
    }
  }
}

typedef pair<int, int> P;

int vis[10][10];
void color(int b[10][10], int c) {
  memset(vis, 0, sizeof vis);
  int cc = b[0][0];
  queue<P> q;
  q.push({0, 0});
  b[0][0] = c;
  while (q.size()) {
    int x = q.front().first, y = q.front().second;
    q.pop();
    for (int k = 0; k < 4; k++) {
      int nx = x + dx[k], ny = y + dy[k];
      if (in(nx, ny) && b[ny][nx] == cc && !vis[ny][nx]) {
        vis[ny][nx] = 1;
        b[ny][nx] = c;
        q.push({nx, ny});
      }
    }
  }
}

void dfs(int n) {
  if (n == 20)
    return;
  for (int c = 0; c < 3; c++) {
    int cnt = 0;
    for (int i = 0; i < H; i++) {
      cnt += count(b[i], b[i] + W, c);
    }
    if (cnt == H * W) {
      ans = min(ans, n);
      return;
    }
  }

  int tmp[10][10];
  copy_board(tmp, b);
  for (int i = 0; i < 3; i++) {
    copy_board(b, tmp);
    if (b[0][0] != i) {
      color(b, i);

      dfs(n + 1);
    }
  }
  copy_board(b, tmp);
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  while (cin >> W >> H, W) {
    for (int i = 0; i < H; i++) {
      for (int j = 0; j < W; j++) {
        char c;
        cin >> c;
        if (c == 'R')
          b[i][j] = 0;
        if (c == 'G')
          b[i][j] = 1;
        if (c == 'B')
          b[i][j] = 2;
      }
    }

    ans = INF;
    dfs(0);
    cout << ans << endl;
  }
}

Fixed submission:
#include <algorithm>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;
const int INF = 1 << 25;
int ans;
int b[10][10];
int W, H;

int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
bool in(int x, int y) { return 0 <= x && x < W && 0 <= y && y < H; }

void copy_board(int dst[10][10], int src[10][10]) {
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      dst[i][j] = src[i][j];
    }
  }
}

typedef pair<int, int> P;

int vis[10][10];
void color(int b[10][10], int c) {
  memset(vis, 0, sizeof vis);
  int cc = b[0][0];
  queue<P> q;
  q.push({0, 0});
  b[0][0] = c;
  while (q.size()) {
    int x = q.front().first, y = q.front().second;
    q.pop();
    for (int k = 0; k < 4; k++) {
      int nx = x + dx[k], ny = y + dy[k];
      if (in(nx, ny) && b[ny][nx] == cc && !vis[ny][nx]) {
        vis[ny][nx] = 1;
        b[ny][nx] = c;
        q.push({nx, ny});
      }
    }
  }
}

void dfs(int n) {
  if (n == 20 || ans < n)
    return;
  for (int c = 0; c < 3; c++) {
    int cnt = 0;
    for (int i = 0; i < H; i++) {
      cnt += count(b[i], b[i] + W, c);
    }
    if (cnt == H * W) {
      ans = min(ans, n);
      return;
    }
  }

  int tmp[10][10];
  copy_board(tmp, b);
  for (int i = 0; i < 3; i++) {
    copy_board(b, tmp);
    if (b[0][0] != i) {
      color(b, i);

      dfs(n + 1);
    }
  }
  copy_board(b, tmp);
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  while (cin >> W >> H, W) {
    for (int i = 0; i < H; i++) {
      for (int j = 0; j < W; j++) {
        char c;
        cin >> c;
        if (c == 'R')
          b[i][j] = 0;
        if (c == 'G')
          b[i][j] = 1;
        if (c == 'B')
          b[i][j] = 2;
      }
    }

    ans = INF;
    dfs(0);
    cout << ans << endl;
  }
}