HDU 2612

按理说是一道挺简单的BFS的

我刚开始直接写了一个 双向BFS ,结果一直过不掉

后来想想如果双方搜索速度不一样还是会出BUG

只好改一改变成两次 单独的BFS + 最后枚举判断最小值

 1 #include <iostream>
 2 #include <queue>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 const int d[4][2]={1,0,-1,0,0,1,0,-1};
 7 struct node{
 8     int t,x,y;
 9 }s,e;
10 int vis1[205][205],vis2[205][205];
11 char map[205][205];
12 int n,m;
13 queue <node> qf,qb;
14 bool check(node& p)
15 {
16     return p.x>=0&&p.x<n&&p.y>=0&&p.y<m&&map[p.x][p.y]!='#';
17 }
18 void bfs()
19 {
20     int i;
21     node now,nxt;
22     memset(vis1,0,sizeof(vis1));
23     memset(vis2,0,sizeof(vis2));
24     while(!qf.empty()) qf.pop();
25     while(!qb.empty()) qb.pop();
26     qf.push(s); qb.push(e);
27     while(!qf.empty())
28     {
29         now=qf.front(); qf.pop();
30         for(i=0;i<4;++i)
31         {
32             nxt.x=now.x+d[i][0];
33             nxt.y=now.y+d[i][1];
34             nxt.t=now.t+1;
35             if(check(nxt)&&!vis1[nxt.x][nxt.y])
36             {
37                 vis1[nxt.x][nxt.y]=nxt.t;
38                 qf.push(nxt);
39             }
40         }
41     }
42     while(!qb.empty())
43     {
44         now=qb.front(); qb.pop();
45         for(i=0;i<4;++i)
46         {
47             nxt.x=now.x+d[i][0];
48             nxt.y=now.y+d[i][1];
49             nxt.t=now.t+1;
50             if(check(nxt)&&!vis2[nxt.x][nxt.y])
51             {
52                 vis2[nxt.x][nxt.y]=nxt.t;
53                 qb.push(nxt);
54             }
55         }
56     }
57 }
58 int main()
59 {
60     int i,j;
61     while(~scanf("%d%d",&n,&m))
62     {
63         for(i=0;i<n;i++)
64         {
65             scanf("%s",map[i]);
66             for(j=0;j<m;j++)
67             {
68                 if(map[i][j]=='Y') s.x=i,s.y=j,map[i][j]='#';
69                 if(map[i][j]=='M') e.x=i,e.y=j,map[i][j]='#';
70             }
71         }
72         s.t=e.t=0;
73         bfs();
74         int ans=99999999;
75         for(i=0;i<n;i++)
76             for(j=0;j<m;j++)
77                 if(map[i][j]=='@'&&vis1[i][j]&&vis2[i][j])
78                 {
79                     ans=min(ans,vis1[i][j]+vis2[i][j]);    
80                 }
81                 
82         printf("%d
",ans*11);
83     }
84 }
85 /*
86 2 4
87 .Y@#
88 M...
89 */
我自倾杯,君且随意
原文地址:https://www.cnblogs.com/nicetomeetu/p/5525498.html