HUOJ 2162

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <queue>
 7 using namespace std;
 8 struct node
 9 {
10     int x,y,step;
11 }s1,s2;
12 int n,m,dir[4][2]={-1,0,1,0,0,1,0,-1},mi,vis[220][220];
13 int dis[2][220][220];
14 char a[220][220];
15 void bfs(int s,int sx,int sy)
16 {
17     node temp,next;
18     queue<node>q;
19     if(s==0)
20     q.push(s1);
21     else
22     q.push(s2);
23     while(!q.empty())
24     {
25         temp=q.front();q.pop();
26         if(a[temp.x][temp.y]=='@')
27          {
28              dis[s][temp.x][temp.y]=temp.step;
29              vis[temp.x][temp.y]=1;
30          }
31         for(int i=0;i<4;i++)
32         {
33             next.x=temp.x+dir[i][0];
34             next.y=temp.y+dir[i][1];
35             next.step=temp.step+11;
36             if(next.x>=0&&next.y>=0&&next.x<n&&next.y<m&&(a[next.x][next.y]=='.'||a[next.x][next.y]=='@')&&vis[next.x][next.y]==0)
37             {
38                 q.push(next);
39                 vis[next.x][next.y]=1;
40             }
41         }
42     }
43 }
44 int main(int argc, char *argv[])
45 {
46     while(scanf("%d%d",&n,&m)!=EOF)
47     {
48         for(int i=0;i<n;i++)
49             scanf("%s",a[i]);
50         mi=9999;
51         memset(dis,0,sizeof(dis));
52         for(int i=0;i<n;i++)
53         {
54             for(int j=0;j<m;j++)
55             {
56                 if(a[i][j]=='Y')
57                 {
58                     s1.x=i;
59                     s1.y=j;
60                     s1.step=0;
61                     memset(vis,0,sizeof(vis));
62                     bfs(0,i,j);
63                 }
64                 if(a[i][j]=='M')
65                 {
66                     s2.x=i;
67                     s2.y=j;
68                     s2.step=0;
69                     memset(vis,0,sizeof(vis));
70                     bfs(1,i,j);
71                 }
72             }
73         }
74         for(int i=0;i<n;i++)
75         {
76             for(int j=0;j<m;j++)
77             {
78                 if(a[i][j]=='@')
79                 {
80                     if(dis[0][i][j]!=0&&dis[1][i][j]!=0)
81                     {
82                         mi=min(mi,dis[0][i][j]+dis[1][i][j]);
83                     }
84                     
85                 }
86             }
87         }
88         printf("%d\n",mi);
89     }
90     return 0;
91 }

 

posted @ 2018-07-25 00:23  huluxin  阅读(214)  评论(0编辑  收藏  举报