/* Fri Mar 19 17:09:29 JST 2004 */ /* Fri Mar 19 17:37:31 JST 2004 */ #include #include #include int adj[52][52]; int minp; int p1, p2; int ctoi(char c) { if (isupper(c)) { return c-'A'; } if (islower(c)) { return c-'a' + 26; } return c/0; } int back(int s) { return s + ((s-1) / 19) + 1; } void dfs(int current, int visited[52], int have) { int i; if (current == p1) { if (minp > have) { minp = have; } return; } for (i = 0; i < 52; i++) { if (adj[current][i] && !visited[i]) { visited[i] = 1; if (0 <= current && current <= 25) { dfs(i, visited, back(have)); } else { dfs(i, visited, have + 1); } visited[i] = 0; } } } int main() { char s[1024]; int i, j, n, p, visited[52]; char c1, c2; int icase; for (icase = 1; ; icase++) { gets(s); n = atoi(s); if (n < 0) { break; } for (i = 0; i <= 52; i++) { for (j = 0; j <= 52; j++) { adj[i][j] = 0; } } for (i = 0; i < n; i++) { gets(s); sscanf(s, "%c %c", &c1, &c2); adj[ctoi(c1)][ctoi(c2)] = adj[ctoi(c2)][ctoi(c1)] = 1; } gets(s); sscanf(s, "%d %c %c", &p, &c1, &c2); p1 = ctoi(c1); p2 = ctoi(c2); for (i = 0; i < 52; i++) { visited[i] = 0; } minp = INT_MAX; dfs(p2, visited, p); printf("Case %d: %d\n", icase, minp); } return 0; }