题目意思:有两个人,去一个地方(KFC),从不同的地方出发,要求两人相遇时用的时间最短!
思路:用到搜索,及两人分别搜索,同时进行!
具体思路:见代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct point
{
int x,y,step;
};
#define N 205
int map[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//首先确定四个方向。
int ans1[1001],ans2[1001],ans[1001],dir[N][N];
char s[N][N];
point ss[1000];
int n,m,x1,x2,y1,y2,Min,t;
int isok(int x,int y)//判断点是否符合要求。。。
{
int i;
for(i=1;i<t;i++)
{
if(ss[i].x==x&&ss[i].y==y)
return i;
}
return 0;
}
void bfs_Y(int x,int y)//开始搜索,
{
int i;
queue<point>Q;//利用优先队列将走过的路直接除去,
point s1,s2;
s1.x=x;
s1.y=y;
s1.step=0;
Q.push(s1);
memset(ans,0,sizeof(ans));//初始化。
memset(dir,0,sizeof(dir));
dir[s1.x][s1.y]=1;
while(!Q.empty())
{
s1=Q.front();
Q.pop();
int k=isok(s1.x,s1.y);//判断点,
if(k)
{
dir[s1.x][s1.y]=1;
ans[k]=s1.step;//标记下步数。
}
for(i=0;i<4;i++)
{
s2=s1;
s2.x+=map[i][0];
s2.y+=map[i][1];
s2.step++;//记步数。
if((s[s2.x][s2.y]=='.'||s[s2.x][s2.y]=='@')&&dir[s2.x][s2.y]==0)//条件判断。
{
Q.push(s2);
dir[s2.x][s2.y]=1;//标记所走的路!
}
}
}
for(i=1;i<t;i++)
{
if(ans[i])
ans1[i]=ans[i];//记下每一步所花的时间!
else
ans1[i]=-1;
}
}
void bfs_M(int x,int y)
{
int i;
queue<point>Q;
point s1,s2;
s1.x=x;
s1.y=y;
s1.step=0;
Q.push(s1);
memset(ans,0,sizeof(ans));
memset(dir,0,sizeof(dir));
dir[s1.x][s1.y]=1;
while(!Q.empty())
{
s1=Q.front();
Q.pop();
int k=isok(s1.x,s1.y);
if(k)
{
dir[s1.x][s1.y]=1;
ans[k]=s1.step;
}
for(i=0;i<4;i++)
{
s2=s1;
s2.x+=map[i][0];
s2.y+=map[i][1];
s2.step++;
if((s[s2.x][s2.y]=='.'||s[s2.x][s2.y]=='@')&&dir[s2.x][s2.y]==0)
{
Q.push(s2);
dir[s2.x][s2.y]=1;
}
}
}
for(i=1;i<t;i++)
{
if(ans[i])
ans2[i]=ans[i];
else
ans2[i]=-1;
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
getchar();
Min=9999;
t=1;
memset(s,'#',sizeof(s));
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&s[i][j]);
if(s[i][j]=='Y')
{
x1=i;
y1=j;
}
else if(s[i][j]=='M')
{
x2=i;
y2=j;
}
else if(s[i][j]=='@')
{
ss[t].x=i;
ss[t++].y =j;
}
}
getchar();
}
bfs_Y(x1,y1);
bfs_M(x2,y2);
for(i=1;i<t;i++)
{
if(ans1[i]!=-1&&ans2[i]!=-1)
{
int T=ans1[i]+ans2[i];
if(T<Min)
Min=T;
}
}
printf("%d\n",Min*11);
}
return 0;
}