#include #include using std::list; struct robot { int x, y; char keys; robot(int x, int y, char keys) : x(x), y(y), keys(keys) { /* printf("r: %d %d %d born.\n", x,y,keys); */ } robot clone(int dx, int dy) { return robot(x+dx, y+dy, keys); } /* ~robot() { printf("r: %d %d %d killed.\n", x,y,keys); } */ }; char key(char c) { char r = 0; switch(c) { case 'b': r = 1; break; case 'y': r = 2; break; case 'r': r = 4; break; case 'g': r = 8; break; } return r; } char door(char c) { char r = 0; switch(c) { case 'B': r = 1; break; case 'Y': r = 2; break; case 'R': r = 4; break; case 'G': r = 8; break; } return r; } int main() { char tile[102*102]; int stat[102*102]; for(;;) { int r, c; scanf("%d %d", &r, &c); getchar(); if(r==0 && c==0) break; c += 2; for(int y = 1; y<=r; y++) fgets(&tile[1 + y*c], c, stdin); for(int x = 0; x rl[2]; int lidx = 0; rl[0].clear(); rl[1].clear(); rl[lidx].push_back( robot(sx, sy, 0) ); int steps = 0; while(!rl[lidx].empty()) { eexit = false; list::iterator ri, rb = rl[lidx].begin(), re = rl[lidx].end(); //empty newborn list rl[lidx^1].clear(); for(ri = rb; ri!=re; ri++) { robot ar = *ri; char t = tile[ar.x + ar.y*c]; ar.keys |= key(t); if(stat[ar.x + ar.y*c] & (1<