#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long LL; typedef long double LD; typedef vector VI; typedef pair PII; typedef vector VPII; #define MP make_pair #define ST first #define ND second #define PB push_back #define FOR(i,a,b) for( int i=(a); i<=(b); ++i) #define FORD(i,a,b) for( int i=(a); i>=(b); --i) #define REP(i,n) for(int i=0; i<(n); ++i) #define ALL(X) (X).begin(),(X).end() #define SIZE(X) (int)(X).size() #define FOREACH(it,X) for(__typeof((X).begin()) it=(X).begin(); it!=(X).end(); ++it) #define MXN 110 #define BUFLEN 110 int movea[4] = {0, 0, 1, -1}; int moveb[4] = {1, -1, 0, 0}; char buf[BUFLEN]; bool isexit[MXN][MXN]; int lab[MXN][MXN]; int key[MXN][MXN]; int n, m; bool inside(int a, int b) { return 0 <= a && a < n && 0 <= b && b < m; } int encode(int a, int b, int s) { return ((a * m) + b) * 16 + s; } void decode(int x, int &a, int &b, int &s) { s = x % 16; x /= 16; b = x % m; x /= m; a = x; } int starta, startb, cura, curb, nexta, nextb, h, t, curstate, nextstate; int steps[MXN*MXN*16]; int kol[MXN*MXN*16]; int main() { fgets(buf, BUFLEN, stdin); sscanf(buf, "%i%i", &n, &m); while (n || m) { for (int a = 0; a < n; a++ ) { fgets(buf, BUFLEN, stdin); for (int b = 0; b < m; b++ ) { lab[a][b] = 0; key[a][b] = 0; isexit[a][b] = buf[b] == 'X'; if (buf[b] == '*') { starta = a; startb = b; } if (buf[b] == 'b') key[a][b] = 1; if (buf[b] == 'y') key[a][b] = 2; if (buf[b] == 'r') key[a][b] = 4; if (buf[b] == 'g') key[a][b] = 8; if (buf[b] == 'B') lab[a][b] = 1; if (buf[b] == 'Y') lab[a][b] = 2; if (buf[b] == 'R') lab[a][b] = 4; if (buf[b] == 'G') lab[a][b] = 8; if (buf[b] == '#') lab[a][b] = 16; } } fgets(buf, BUFLEN, stdin); fill(steps, steps + n*m*16, -1); h = 0; t = 0; kol[t++] = encode(starta, startb, 0); steps[kol[0]] = 0; while (h < t) { int stepshere = steps[kol[h]]; decode(kol[h++], cura, curb, curstate); for (int mv = 0; mv < 4; mv++ ) { nexta = cura + movea[mv]; nextb = curb + moveb[mv]; if (!inside(nexta, nextb) || (lab[nexta][nextb] & curstate) != lab[nexta][nextb]) continue; nextstate = curstate | key[nexta][nextb]; int next = encode(nexta, nextb, nextstate); if (steps[next] == -1) { kol[t++] = next; steps[next] = stepshere + 1; } } } int res = -1; for (int a = 0; a < n; a++ ) for (int b = 0; b < m; b++ ) if (isexit[a][b]) for (int c = 0; c < 16; c++ ) if (steps[encode(a,b,c)] != -1 && (res == -1 || res > steps[encode(a,b,c)])) res = steps[encode(a,b,c)]; if (res == -1) printf("The poor student is trapped!\n"); else printf("Escape possible in %i steps.\n", res); fgets(buf, BUFLEN, stdin); sscanf(buf, "%i%i", &n, &m); } return 0; }