#include #include #include #include #include using namespace std; int n,ok,p1,p2,p3; int ans[51][51][51]; char map[51][51]; struct Hike{ char a,b,c; }; void bfs() { int i,a,b,c; queueQ; Hike tmp; ans[p1][p2][p3] = 0; tmp.a = p1; tmp.b = p2; tmp.c = p3; Q.push(tmp); while(!Q.empty()) { tmp = Q.front(); Q.pop(); a = tmp.a; b = tmp.b; c = tmp.c; if((a == b) && (a == c)) { ok = a; break; } int current = ans[a][b][c]; current ++; char *color ; char bcColor = map[b][c]; color = map[a]+1; for(i=1;i<=n;i++,color++) { if(i != a && *color == bcColor && ans[i][b][c] > current) { ans[i][b][c] = current; tmp.a = i; tmp.b = b; tmp.c = c; Q.push(tmp); } } char acColor = map[a][c]; color = map[b] + 1; for(i=1;i<=n;i++,color++) { if(i != b && *color == acColor && ans[a][i][c] > current) { ans[a][i][c] = current; tmp.a = a; tmp.b = i; tmp.c = c; Q.push(tmp); } } char abColor = map[a][b]; color = map[c] + 1; for(i=1;i<=n;i++,color++) { if(i != c && *color == abColor && ans[a][b][i] > current) { ans[a][b][i] = current; tmp.a = a; tmp.b = b; tmp.c = i; Q.push(tmp); } } } } int main() { int i,j; char str[110]; while(scanf("%d",&n)!=EOF && n) { scanf("%d%d%d\n",&p1,&p2,&p3); for(i=1;i<=n;i++) { gets(str); for(j=0;j