Language: C++

#include <queue>
#include <vector>
#include <iostream>
using namespace std;
int H, W; char c;
int main() {
	ios::sync_with_stdio(false);
	while (cin >> W >> H, H | W) {
		vector<vector<int> > a(H, vector<int>(W));
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				cin >> c;
				if (c == 'R') a[i][j] = 0;
				if (c == 'G') a[i][j] = 1;
				if (c == 'B') a[i][j] = 2;
			}
		}
		vector<vector<pair<int, int> > > comp;
		vector<vector<bool> > vis(H, vector<bool>(W, false));
		vector<int> dir({ 0, 1, 0, -1 });
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				if (vis[i][j]) continue;
				comp.push_back(vector<pair<int, int> >({ make_pair(j, i) }));
				vis[i][j] = true;
				queue<pair<int, int> > que;
				que.push(make_pair(j, i));
				while (!que.empty()) {
					pair<int, int> u = que.front(); que.pop();
					for (int k = 0; k < 4; k++) {
						int tx = u.first + dir[k], ty = u.second + dir[k ^ 1];
						if (0 <= tx && tx < W && 0 <= ty && ty < H && !vis[ty][tx] && a[u.second][u.first] == a[ty][tx]) {
							vis[ty][tx] = true;
							comp.back().push_back(make_pair(tx, ty));
							que.push(make_pair(tx, ty));
						}
					}
				}
			}
		}
		vector<int> col(comp.size());
		for (int i = 0; i < comp.size(); i++) {
			for (pair<int, int> j : comp[i]) {
				col[i] = a[j.second][j.first];
				a[j.second][j.first] = i;
			}
		}
		vector<vector<int> > G(comp.size());
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				if (j + 1 != W && a[i][j] != a[i][j + 1]) {
					G[a[i][j]].push_back(a[i][j + 1]);
					G[a[i][j + 1]].push_back(a[i][j]);
				}
				if (i + 1 != H && a[i][j] != a[i + 1][j]) {
					G[a[i][j]].push_back(a[i + 1][j]);
					G[a[i + 1][j]].push_back(a[i][j]);
				}
			}
		}
		for (int i = 0; i < G.size(); i++) {
			sort(G[i].begin(), G[i].end());
			int ptr = unique(G[i].begin(), G[i].end()) - G[i].begin();
			G[i].erase(G[i].begin() + ptr, G[i].end());
		}
		for (int i = 0; ; i++) {
			bool ok = false;
			for (int j = 0; j < 1 << i; j++) {
				vector<int> w1(col);
				for (int k = 0; k < i; k++) {
					int r = (w1[a[0][0]] + ((j & (1 << k)) ? 2 : 1)) % 3;
					queue<int> que2; que2.push(a[0][0]);
					vector<bool> vis2(G.size()); vis2[a[0][0]] = true;
					while (!que2.empty()) {
						int u = que2.front(); que2.pop();
						for (int l : G[u]) {
							if (!vis2[l] && w1[u] == w1[l]) {
								vis2[l] = true;
								que2.push(l);
							}
						}
					}
					for (int l = 0; l < G.size(); l++) {
						if (vis2[l]) w1[l] = r;
					}
				}
				bool flag = true;
				for (int k = 1; k < G.size(); k++) {
					if (w1[0] != w1[k]) {
						flag = false;
						break;
					}
				}
				if (flag) {
					ok = true;
					break;
				}
			}
			if (ok) {
				cout << i << endl;
				break;
			}
		}
	}
	return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:62:25: error: 'sort' was not declared in this scope; did you mean 'short'?
   62 |                         sort(G[i].begin(), G[i].end());
      |                         ^~~~
      |                         short
a.cc:63:35: error: 'unique' was not declared in this scope
   63 |                         int ptr = unique(G[i].begin(), G[i].end()) - G[i].begin();
      |                                   ^~~~~~