Problem Description
Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki.
Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city. So yifenfei made arrangements with Merceki to meet at a KFC. There are many KFC in Ningbo, they want to choose one that let the total time to it be most smallest. Now give you a Ningbo map, Both yifenfei and Merceki can move up, down ,left, right to the adjacent road by cost 11 minutes. |
Input
The input contains multiple test cases.
Each test case include, first two integers n, m. (2<=n,m<=200). Next n lines, each line included m character. ‘Y’ express yifenfei initial position. ‘M’ express Merceki initial position. ‘#’ forbid road; ‘.’ Road. ‘@’ KCF |
Output
For each test case output the minimum total time that both yifenfei and Merceki to arrival one of KFC.You may sure there is always have a KFC that can let them meet.
|
Sample Input
4 4 Y.#@ .... .#.. @..M 4 4 Y.#@ .... .#.. @#.M 5 5 Y..@. .#... .#... @..M. #...# |
Sample Output
66 88 66 |
Author
yifenfei
|
Source
奋斗的年代
|
Recommend
yifenfei
|
上述每人只需要搜一次并记录下到每一个@的步数和,最后一比较就好了!
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=202;
const int INF=0x3f3f3f3f;
char map1[maxn][maxn],vis[maxn][maxn];
int dis[maxn][maxn][2]; //记录下来每个@所走的步数,其中第三位代表的是哪个人在走
int n,m,flag;
struct node
{
int x,y,step;
};
bool judge(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&!vis[x][y]&&map1[x][y]!='#')
return 1;
return 0;
}
int dxy[][2]= {0,1,0,-1,1,0,-1,0};
void bfs(int x,int y)
{
node now,next;
queue<node>q;
now.x=x,now.y=y,now.step=0;
q.push(now);
vis[x][y]=1;
while(!q.empty())
{
now=q.front();
if(map1[now.x][now.y]=='@') //遇到@就记录下来走了多少步
dis[now.x][now.y][flag]=now.step;
for(int i=0; i<4; i++)
{
int xx=now.x+dxy[i][0],yy=now.y+dxy[i][1];
if(judge(xx,yy))
{
vis[xx][yy]=1;
next.x=xx,next.y=yy,next.step=now.step+1;
q.push(next);
}
}
q.pop();
}
}
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>m)
{
int i,j,s=INF;
for(i=0; i<n; i++)
for(j=0; j<m; j++)
dis[i][j][0]=dis[i][j][1]=INF; //有的@可能是无法到达的,所以用无穷大初始化!
for(i=0; i<n; i++)
cin>>map1[i];
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
if(map1[i][j]=='Y')
{
flag=0;
memset(vis,0,sizeof(vis));
bfs(i,j);
}
if(map1[i][j]=='M')
{
flag=1;
memset(vis,0,sizeof(vis));
bfs(i,j);
}
}
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
if(map1[i][j]=='@'&&s>dis[i][j][0]+dis[i][j][1]) //求最小的步数,相比较
s=dis[i][j][0]+dis[i][j][1];
}
cout<<s*11<<endl;
}
return 0;
}