zoj1103 Hike on a Graph

广搜题,把每移动一步所得的状态都存下来,如果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;

}

你可能感兴趣的:(Graph)