#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 50 + 5;
int n;
struct node
{
int p1, p2, p3, step;
} point;
int go[maxn][maxn];
int get_id()
{
char ch;
for(;;)
{
scanf("%c", &ch);
if(ch >= 'a' && ch <= 'z') break;
}
return ch - 'a' + 1;
}
int vis[maxn][maxn][maxn];
int check(node x)
{
if(x.p1 == x.p2 && x.p1 == x.p3) return true;
return false;
}
int bfs()
{
point.p1--; point.p2--; point.p3--;
if(point.p1 == point.p2 && point.p1 == point.p3) return 0;
memset(vis, 0, sizeof(vis));
vis[point.p1][point.p2][point.p3] = 1;
point.step = 0;
queue<node> q;
q.push(point);
while(!q.empty())
{
node sq = q.front();
//printf("%d %d %d\n", sq.p1, sq.p2, sq.p3);
q.pop();
sq.step++;
node tq = sq;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
if(i != j && go[i][j])
{
if(tq.p1 == i && !vis[j][tq.p2][tq.p3] && go[i][j] == go[tq.p2][tq.p3])
{
tq.p1 = j;
vis[tq.p1][tq.p2][tq.p3] = 1;
if(check(tq)) return tq.step;
q.push(tq);
tq = sq;
}
if(tq.p2 == i && !vis[tq.p1][j][tq.p3] && go[i][j] == go[tq.p1][tq.p3])
{
tq.p2 = j;
vis[tq.p1][tq.p2][tq.p3] = 1;
if(check(tq)) return tq.step;
q.push(tq);
tq = sq;
}
if(tq.p3 == i && !vis[tq.p1][tq.p2][j] && go[i][j] == go[tq.p1][tq.p2])
{
tq.p3 = j;
vis[tq.p1][tq.p2][tq.p3] = 1;
if(check(tq)) return tq.step;
q.push(tq);
tq = sq;
}
}
}
}
return -1;
}
void print()
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
printf("%d ", go[i][j]);
}
printf("\n");
}
}
int main()
{
while(scanf("%d", &n) == 1 && n)
{
memset(go, 0, sizeof(go));
scanf("%d%d%d", &point.p1, &point.p2, &point.p3);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
int id = get_id();
go[i][j] = id;
}
//print();
int t = bfs();
if(t < 0) printf("impossible\n");
else printf("%d\n", t);
}
return 0;
}
理解题意特别重要!!!!!!!!!!!!
题意大致是有p1, p2, p3三个东西,判断p1 -> a是否可行, 只要 p2 与 p3路径颜色与p1和a一样就行,接下来机械式的bfs就行
上代码