#include #include using namespace std; #define INF 2000000000 char tab[110][110]; int odl[110][110][16]; bool odw[110][110][16]; char buffer[110]; int conv(int i, int j, int k) { return i+110*(j+ 110*k); } int jeden() { int r, c; scanf("%d%d", &r,&c); if(r==0 && c==0) return -1; for(int i = 0; i Q; for(int i = 0; i=r || j<0 || j>=c) continue; if(odw[i][j][k]) continue; odw[i][j][k]=1; if(tab[i][j]=='#') continue; switch(tab[i][j]) { case 'B': if(!(k&1)) continue; break; case 'Y': if(!(k&2)) continue; break; case 'R': if(!(k&4)) continue; break; case 'G': if(!(k&8)) continue; break; case 'X': return odl[i][j][k]; case 'b': if(!(k&1)) { Q.push(conv(i,j,k|1)); odl[i][j][k|1]=odl[i][j][k]; continue; } break; case 'y': if(!(k&2)) { Q.push(conv(i,j,k|2)); odl[i][j][k|2]=odl[i][j][k]; continue; } break; case 'r': if(!(k&4)) { Q.push(conv(i,j,k|4)); odl[i][j][k|4]=odl[i][j][k]; continue; } break; case 'g': if(!(k&8)) { Q.push(conv(i,j,k|8)); odl[i][j][k|8]=odl[i][j][k]; continue; } break; } //printf("%d %d %d\n", i,j,k); int a,b; { a = i-1; b = j; if(a>=0 &&a=0 && bodl[i][j][k]+1) { odl[a][b][k]=odl[i][j][k]+1; Q.push(conv(a,b,k)); } } { a = i+1; b = j; if(a>=0 &&a=0 && bodl[i][j][k]+1) { odl[a][b][k]=odl[i][j][k]+1; Q.push(conv(a,b,k)); } } { a = i; b = j-1; if(a>=0 &&a=0 && bodl[i][j][k]+1) { odl[a][b][k]=odl[i][j][k]+1; Q.push(conv(a,b,k)); } } { a = i; b = j+1; if(a>=0 &&a=0 && bodl[i][j][k]+1) { odl[a][b][k]=odl[i][j][k]+1; Q.push(conv(a,b,k)); } } } return INF; } int main() { while(1) { int w = jeden(); if(w==-1) break; else if(w