4 4 Y.#@ .... .#.. @..M 4 4 Y.#@ .... .#.. @#.M 5 5 Y..@. .#... .#... @..M. #...#
66 88 66
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#define N 100010
#define Mod 10000007
#define lson l,mid,idx<<1
#define rson mid+1,r,idx<<1|1
#define lc idx<<1
#define rc idx<<1|1
const double EPS = 1e-11;
const double PI = acos(-1.0);
typedef long long ll;
const int INF=1000010;
using namespace std;
struct node
{
int x,y;
int num;//保存两人到@的最小值
int num2;
};
vector<node>q;
queue<node>que;
int n,m;
char mp[222][222];
bool vis[222][222];
int len,Min,l;
int Mx,My,Yx,Yy;
int xx[4]= {-1,0,1,0};
int yy[4]= {0,1,0,-1};
void bfs(int x,int y)
{
memset(vis,0,sizeof vis);
while(que.size())
que.pop();
node t,tt;
t.x=x,t.y=y;
t.num=0;
que.push(t);
int s=0;
while(que.size())
{
t=que.front();
que.pop();
if(mp[t.x][t.y]=='@')
{
for(int i=0; i<l; i++)//找到@
{
if(q[i].x==t.x&&q[i].y==t.y)
{
q[i].num=min(t.num,q[i].num);
break;
}
}
}
for(int i=0; i<4; i++)
{
tt.x=t.x+xx[i];
tt.y=t.y+yy[i];
tt.num=t.num+1;
if(tt.x>=0&&tt.x<n&&tt.y>=0&&tt.y<m&&mp[tt.x][tt.y]!='#'&&!vis[tt.x][tt.y])
{
que.push(tt);
vis[tt.x][tt.y]=1;
}
}
}
}
int main()
{
//freopen("test.in","r",stdin);
while(cin>>n>>m)
{
len=0;
q.clear();
node a;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
cin>>mp[i][j];
if(mp[i][j]=='@')
{
a.x=i,a.y=j,a.num=INF,a.num2=0;
q.push_back(a);
}
if(mp[i][j]=='Y')
{
Yx=i,Yy=j;
}
if(mp[i][j]=='M')
{
Mx=i,My=j;
}
}
l=q.size();
bfs(Mx,My);
for(int i=0; i<l; i++)//把num的值转给num2,num重新复制无穷大
{
q[i].num2=q[i].num;
q[i].num=INF;
}
bfs(Yx,Yy);
Min=INF;
for(int i=0; i<l; i++)
{
if(q[i].num2+q[i].num<Min)
Min=q[i].num+q[i].num2;
}
cout<<Min*11<<endl;
}
return 0;
}
原文地址:http://blog.csdn.net/acm_baihuzi/article/details/42344489