广搜题,把每移动一步所得的状态都存下来,如果3个玩家所在的位置相同就返回。。
# include<stdio.h> # include<string.h> # include<queue> using namespace std; char ch[10]; int n,map[55][55],p[5],visit[55][55][55]; struct node{ int val,ans1,ans2,ans3; }; int dfs() { int i,ans; queue<node>q; node cur,next; cur.ans1=p[1]; cur.ans2=p[2]; cur.ans3=p[3]; cur.val=0; q.push(cur); visit[cur.ans1][cur.ans2][cur.ans3]=1; while(!q.empty()) { cur=q.front(); q.pop(); if(cur.ans1==cur.ans2 && cur.ans2==cur.ans3) return cur.val; ans=map[cur.ans2][cur.ans3]; for(i=1;i<=n;i++) { if(map[cur.ans1][i]==ans) { if(visit[i][cur.ans2][cur.ans3]==0) { visit[i][cur.ans2][cur.ans3]=1; next.ans1=i; next.ans2=cur.ans2; next.ans3=cur.ans3; next.val=cur.val+1; q.push(next); } } } ans=map[cur.ans1][cur.ans3]; for(i=1;i<=n;i++) { if(map[cur.ans2][i]==ans) { if(visit[cur.ans1][i][cur.ans3]==0) { visit[cur.ans1][i][cur.ans3]=1; next.ans1=cur.ans1; next.ans2=i; next.ans3=cur.ans3; next.val=cur.val+1; q.push(next); } } } ans=map[cur.ans1][cur.ans2]; for(i=1;i<=n;i++) { if(map[cur.ans3][i]==ans) { if(visit[cur.ans1][cur.ans2][i]==0) { visit[cur.ans1][cur.ans2][i]=1; next.ans1=cur.ans1; next.ans2=cur.ans2; next.ans3=i; next.val=cur.val+1; q.push(next); } } } } return -1; } int main() { int i,j,ans; while(scanf("%d",&n)!=EOF && n) { for(i=1;i<=3;i++) scanf("%d",&p[i]); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%s",ch); map[i][j]=ch[0]-'a'+1; } } memset(visit,0,sizeof(visit)); ans=dfs(); if(ans==-1) printf("impossible\n"); else printf("%d\n",ans); } return 0; }