1.题意:你约你喜欢的妹子去KFC,你们想找一家最近的,使得你和妹子到KFC所用时间和最短。
2.思路:相当于进行两次BFS搜索,可以从每个KFC当做起始点 出发搜索Y和M,也可以从Y和M出发搜索到达每个KFC的时间,然后用一个数组保存到达每个kfc的总时间,找到最小值输出即可,要记得在合适的时间初始化vis和cost数组,要不然会出现不必要的麻烦。要注意考虑到题目中的极端情况,也就是有一家KFC距离最近,但是无法到达,所以不能够选择这一家,考虑到这一点之后还是能比较轻松的AC的
3.贴上代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <queue>
#include <string>
using namespace std;
char Map[205][205];
int vis[205][205],cost[205][205];
int mov1[4]{1,-1,0, 0};
int mov2[4]{0, 0,1,-1};
int row,col,yx,yy,mx,my,ans;
struct node{
int x,y,step;
};
int bfs(int a,int b)
{
memset(vis,0,sizeof(vis));
queue<node> way;
node start;
start.x=a;
start.y=b;
start.step=0;
way.push(start);
while(!way.empty())
{
node now=way.front();
way.pop();
int xx=now.x,yy=now.y,ss=now.step;
//cout<<xx<<" "<<yy<<" "<<ss<<endl;
for(int i=0;i<4;i++)
{
if(vis[xx+mov1[i]][yy+mov2[i]]!=1&&
xx+mov1[i]>=0&&xx+mov1[i]<row
&&yy+mov2[i]>=0&&yy+mov2[i]<col)
{
if(Map[xx+mov1[i]][yy+mov2[i]]=='#')
continue;
if(Map[xx+mov1[i]][yy+mov2[i]]=='@')
{
node newnode;
vis[xx+mov1[i]][yy+mov2[i]]=1;
newnode.x=xx+mov1[i];
newnode.y=yy+mov2[i];
newnode.step=ss+1;
way.push(newnode);
cost[xx+mov1[i]][yy+mov2[i]]+=newnode.step;
//cout<<cost[newnode.x][newnode.y]<<endl;
}
else if(Map[xx+mov1[i]][yy+mov2[i]]=='.')
{
node newnode;
vis[xx+mov1[i]][yy+mov2[i]]=1;
newnode.x=xx+mov1[i];
newnode.y=yy+mov2[i];
newnode.step=ss+1;
way.push(newnode);
}
}
}
}
int mmax=1000000;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(cost[i][j]!=0&&cost[i][j]<mmax)
mmax=cost[i][j];
//cout<<cost[i][j]<<" ";
}
//cout<<endl;
}
//cout<<mmax<<endl;
return mmax;
}
int main()
{
string s;
while(~scanf("%d%d",&row,&col))
{
memset(cost,0,sizeof(cost));
ans=0;
for(int i=0;i<row;i++)
{
cin>>s;
for(int j=0;j<col;j++)
{
Map[i][j]=s[j];
if(s[j]=='Y'){
yx=i;yy=j;
}
else if(s[j]=='M'){
mx=i;my=j;
}
}
}
ans=bfs(yx,yy);
//cout<<ans<<"######"<<endl;
ans=bfs(mx,my);
//cout<<ans<<"####33"<<endl;
printf("%d\n",ans*11);
}
return 0;
}