#include #include #include #include #include using namespace std; #define PB push_back #define MP make_pair #define FI first #define SE second #define PII pair #define PII2 pair #define INF 1000000000 int R,C; char M[102][102]; int D[102][102][16]; bool valid(PII2 v) { return v.FI.FI >=0 && v.FI.FI =0 && v.FI.SE < C && M[v.FI.FI][v.FI.SE] != '#'; } queue Q; void put(PII2 v, int d) { if(!valid(v) || D[v.FI.FI][v.FI.SE][v.SE] < INF) return; if(M[v.FI.FI][v.FI.SE] == 'b') v.SE |= 1; if(M[v.FI.FI][v.FI.SE] == 'y') v.SE |= 2; if(M[v.FI.FI][v.FI.SE] == 'r') v.SE |= 4; if(M[v.FI.FI][v.FI.SE] == 'g') v.SE |= 8; if(M[v.FI.FI][v.FI.SE] == 'B' && !(v.SE & 1)) return; if(M[v.FI.FI][v.FI.SE] == 'Y' && !(v.SE & 2)) return; if(M[v.FI.FI][v.FI.SE] == 'R' && !(v.SE & 4)) return; if(M[v.FI.FI][v.FI.SE] == 'G' && !(v.SE & 8)) return; Q.push(v); D[v.FI.FI][v.FI.SE][v.SE] = d+1; } int search(int c, int r, int m) { while(!Q.empty()) Q.pop(); Q.push(MP(MP(r,c),m)); D[r][c][m] = 0; while(!Q.empty()) { PII2 u = Q.front(); Q.pop(); r = u.FI.FI; c = u.FI.SE; m = u.SE; if(M[r][c] == 'X') return D[r][c][m]; PII2 ln = MP(MP(r,c-1),m), rn = MP(MP(r,c+1),m), un = MP(MP(r-1,c),m), dn = MP(MP(r+1,c),m); int d = D[r][c][m]; put(ln, d); put(rn, d); put(un, d); put(dn, d); } return INF; } int main() { while(1) { scanf("%d %d", &R, &C); if(!R && !C) break; for(int i=0; i