#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
char M[201][201];
bool book[201][201];
int dis[201][201];
int dis1[201][201];
int n,m,ans;
typedef struct point
{
int x,y,d;
}P;
int sx,s1x,sy,s1y;
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
void bfs()
{
memset(book,0,sizeof(book));
queue<P> q;
P p;
p.x=sx;
p.y=sy;
p.d=0;
q.push(p);
while(!q.empty())
{
P temp=q.front();
int x=temp.x;
int y=temp.y;
int d=temp.d;
book[x][y]=true;
q.pop();
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
int dd=d+1;
if(xx>=0&&xx<n&&yy>=0&&yy<m&&M[xx][yy]!='#'&&book[xx][yy]==false)
{
book[xx][yy]=true;
P tep_point;
tep_point.x=xx;
tep_point.y=yy;
tep_point.d=dd;
q.push(tep_point);
dis[xx][yy]=dd;
}
}
}
}
void bfs1()
{
memset(book,0,sizeof(book));
queue<P> q;
P p;
p.x=s1x;
p.y=s1y;
p.d=0;
q.push(p);
while(!q.empty())
{
P temp=q.front();
int x=temp.x;
int y=temp.y;
int d=temp.d;
book[x][y]=true;
q.pop();
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
int dd=d+1;
if(xx>=0&&xx<n&&yy>=0&&yy<m&&M[xx][yy]!='#'&&book[xx][yy]==false)
{
book[xx][yy]=true;
P tep_point;
tep_point.x=xx;
tep_point.y=yy;
tep_point.d=dd;
q.push(tep_point);
dis1[xx][yy]=dd;
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
vector<P> v;
ans=999999999;
for(int i=0;i<n;i++)
cin>>M[i];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(M[i][j]=='Y')
{
sx=i;
sy=j;
}
if(M[i][j]=='M')
{
s1x=i;
s1y=j;
}
if(M[i][j]=='@')
{
P tep;
tep.x=i;
tep.y=j;
tep.d=0;
v.push_back(tep);
}
}
bfs();
bfs1();
for(int i=0;i<v.size();i++)
{
ans=min(ans,dis[v[i].x][v[i].y]+dis1[v[i].x][v[i].y]);
}
cout<<ans*11<<endl;
}
return 0;
}
hdu2612
最新推荐文章于 2022-11-12 22:37:32 发布