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