Find a way HDU - 2612

原题链接

考察:bfs

WA了n次结果发现是m写成了n真是无极鲅鱼

思路:

        两次bfs,分别统计他们到地图上每一个点的最小时间,在KFC处取最小值即可

不知道能不能让他们同时走,这种写法我不会

易错:
       存在他们不能到达的KFC,所以不能简单地只考虑最小值

 1 #include <iostream>
 2 #include <queue>
 3 #include <cstring>
 4 using namespace std;
 5 const int N = 210;
 6 int n,m,xx[4]={-1,1,0,0},yy[4] = {0,0,-1,1},time[N][N][2];
 7 char mp[N][N];
 8 bool vis[N][N][2];
 9 struct Node{
10     int x,y,d;
11 };
12 void bfs(Node t,int id)
13 {
14     vis[t.x][t.y][id] = 1;
15     queue<Node> q;
16     q.push(t);
17     while(!q.empty())
18     {
19         Node it = q.front();
20         q.pop();
21         for(int i=0;i<4;i++)
22         {
23             int dx = it.x+xx[i],dy = it.y+yy[i];
24             if(dx>=0&&dx<n&&dy>=0&&dy<m&&!vis[dx][dy][id]&&mp[dx][dy]!='#')
25             {
26                 vis[dx][dy][id] = 1;
27                 time[dx][dy][id] = it.d+1;
28                 Node s; s.x = dx,s.y = dy,s.d = it.d+1;
29                 q.push(s); 
30             }
31         }
32     }
33 }
34 int main()
35 {
36 //    freopen("in.txt","r",stdin);
37     while(scanf("%d%d",&n,&m)!=EOF)
38     {
39         memset(vis,0,sizeof(vis));
40         memset(time,0,sizeof(time));
41         Node ys,ms;
42         int ans = 0x3f3f3f;
43         for(int i=0;i<n;i++){
44             for(int j=0;j<m;j++){
45                 cin>>mp[i][j];
46                 if(mp[i][j]=='Y') ys.x=i,ys.y=j,ys.d=0;
47                 else if(mp[i][j]=='M') ms.x=i,ms.y=j,ms.d=0;
48             }
49         }
50         bfs(ys,0);
51         bfs(ms,1);
52         for(int i=0;i<n;i++){
53             for(int j=0;j<m;j++){
54                 if(mp[i][j]=='@'&&vis[i][j][0]&&vis[i][j][1]) ans = min(time[i][j][0]+time[i][j][1],ans);
55             }
56         }
57         printf("%d\n",ans*11);
58     }
59     return 0;
60 } 

 

posted @ 2021-01-10 16:36  acmloser  阅读(56)  评论(0编辑  收藏  举报