#include int n; int or[100], rw[100], pos[100], len[100]; int tmppos[100]; char zad[6][7]; #define QLEN 1000000 char was[10000000]; /*int from[10000000];*/ int queue[QLEN]; int qb, qe, last_qb; int max_code, found, round, dest, act; int encode(int *pos) { int val = 0, i; for (i = 0; i < n; i++) { val = 5 * val + pos[i]; } return val; } void decode(int val, int *pos) { int i; for (i = n - 1; i >=0; i--) { pos[i] = val % 5; val /= 5; } } int final (int *pos) { int mx = len[n - 1] ? 3 : 4; if (pos[n - 1] == mx) { dest = encode (pos); return 1; } return 0; } int mark(int *pos, int fr) { int val = encode (pos); int old = was[val]; int j; was[val] = 1; if (!old) { found |= final (pos); /* from[val] = fr;*/ queue[qe++] = val; if (qe == QLEN) qe = 0; /* for (j = 0; j < n; j++) printf ("(%d)", pos[j]); printf ("\n");*/ } return !old; } char ocup[6][6]; int fill_ocup (int v, int val) { int i, r = 0; for (i = tmppos[v]; i < tmppos[v] + 2 + len[v]; i++) { if (or[v]) { r |= ocup[rw[v]][i]; ocup[rw[v]][i] = val; } else { r |= ocup[i][rw[v]]; ocup[i][rw[v]] = val; } } return r; } int conflict(int a, int b) { int ret; fill_ocup(a, 1); ret = fill_ocup(b, 1); fill_ocup (a, 0); fill_ocup (b, 0); return ret; } int valid_pos(int moved) { int i; for (i = 0; i < n; i++) { if (i == moved) continue; if (conflict (moved, i)) return 0; } return 1; } int mark_moves (void) { int ret = 0; int i, j, mx, ps, v; for (i = 0; i < n; i++) { mx = len[i] ? 3 : 4; ps = tmppos[i]; for (j = tmppos[i] + 1; j <= mx; j++) { tmppos[i] = j; v = valid_pos (i); if (v) { ret |= mark(tmppos, act); } tmppos[i] = ps; if (!v) break; } for (j = tmppos[i] - 1; j>=0; j--) { tmppos[i] = j; v = valid_pos (i); if (v) { ret |= mark(tmppos, act); } tmppos[i] = ps; if (!v) break; } } return ret; } void wave(void) { int p; while (qe != qb) { if (qb == last_qb) { round++; last_qb = qe; } p = queue[qb++]; if (qb == QLEN) qb = 0; decode (p, tmppos); act = p; mark_moves (); if (found) return; } } int main(void) { int i, j, s = 1; while (1) { scanf("%d", &n); if (!n) return 0; for (i = 0; i < 6; i++) scanf("%s", zad[i]); for (i = 0; i < 6; i++) for (j = 0; j < 6; j++) { if (zad[i][j] == '.') continue; if (i != 0 && zad[i-1][j] == zad[i][j]) continue; if (j != 0 && zad[i][j-1] == zad[i][j]) continue; if (i != 5 && zad[i+1][j] == zad[i][j]) { or[zad[i][j] - 'a'] = 0; len[zad[i][j] - 'a'] = i != 4 && zad[i+2][j] == zad[i][j]; pos[zad[i][j]-'a'] = i; rw[zad[i][j]-'a'] = j; } else { or[zad[i][j] - 'a'] = 1; len[zad[i][j] - 'a'] = j != 4 && zad[i][j+2] == zad[i][j]; pos[zad[i][j]-'a'] = j; rw[zad[i][j]-'a'] = i; } } or[n -1] = or['x' - 'a']; len[n -1] = len['x' - 'a']; pos[n -1] = pos['x' - 'a']; rw[n -1] = rw['x' - 'a']; for (i = 0; i < n; i++) tmppos[i] = len[i] ? 3 : 4; max_code = encode (tmppos); memset(was, 0, sizeof (char) * (max_code + 1)); found = 0; round = 0; qb=qe = 0; last_qb = 0; mark (pos, -1); if (!found) wave (); if (found) { printf ("Scenario #%d requires %d moves.\n", s++, round); /* while (dest > 0) { decode (dest, tmppos); for (j = 0; j < n; j++) printf ("(%d)", pos[j]); printf ("\n"); dest = from[dest]; }*/ } else printf ("You are trapped in scenario #%d.\n", s++); } }