#include #include #include using namespace std; const int INF = 1<<29; #define REP(i,n) for(int i=0; i < (n); ++i) int n,m; typedef pair p2; typedef pair T; #define X first #define Y second char mapa[120][120]; int len[120][120][16]; int literka[300], mala_literka[300]; int main() { mala_literka[(unsigned int)'b'] = literka[(unsigned int)'B'] = 1; mala_literka[(unsigned int)'y'] = literka[(unsigned int)'Y'] = 2; mala_literka[(unsigned int)'g'] = literka[(unsigned int)'G'] = 3; mala_literka[(unsigned int)'r'] = literka[(unsigned int)'R'] = 4; const int D[][2] = {{-1,0},{1,0},{0,1},{0,-1}}; while (scanf("%d %d", &n, &m) ==2 && (n || m)) { REP(i,n) { scanf(" %s", mapa[i]); } queue q; REP(i,n) REP(j,m) { REP(t,16) len[i][j][t] = INF; if (mapa[i][j] == '*') { q.push(make_pair(p2(i,j), 0)); mapa[i][j]='.'; len[i][j][0]=0; } } int sol=-1; while (!q.empty()) { T a = q.front(); q.pop(); REP(d,4) { int nx = a.X.X + D[d][0], ny = a.X.Y + D[d][1]; if (nx >= 0 && ny >= 0 && nx < n && ny < m && mapa[nx][ny]!='#') { int lit = 0, stan=a.Y; if ((lit = mala_literka[(unsigned int)mapa[nx][ny]])!=0) { stan = stan | (1<<(lit-1)); } // if (mala_literka[(unsigned int)mapa[nx][ny]]) printf("st:%d\n", stan); if (mapa[nx][ny] == 'X' || mapa[nx][ny] == '.' || mala_literka[(unsigned int)mapa[nx][ny]] || (literka[(unsigned int)mapa[nx][ny]] && (a.Y & (1<<(-1+literka[(unsigned int)mapa[nx][ny]]))))) { if (len[nx][ny][stan] == INF) { len[nx][ny][stan] = len[a.X.X][a.X.Y][a.Y] + 1; // printf("stan: %d\n", stan); if (mapa[nx][ny] == 'X') { sol=len[nx][ny][stan]; break; } q.push(make_pair(p2(nx,ny),stan)); } } } } if (sol != -1) break; } if (sol !=-1) printf("Escape possible in %d steps.\n", sol); else printf("The poor student is trapped!\n"); } return 0; }