HDU2612 Find a way

解题思路:简单的宽搜题,分别存储Y,M到每个@的距离,然后求出每个@处

     对应累加的最小值。见代码:、

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 #define inf 0x3f3f3f3f
 7 const int maxn = 205;
 8 int vis[maxn][maxn], n, m, min1, dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
 9 int dis[maxn][maxn][2], flag;
10 char mapp[maxn][maxn];
11 
12 struct node{
13     int x, y;
14     int cnt;
15 }s, e;
16 
17 queue<node> q;
18 
19 void bfs(int x, int y)
20 {
21     memset(vis, 0, sizeof(vis)); //初始化
22     s.x = x, s.y = y, s.cnt = 0;
23     vis[x][y] = 1;
24     while(!q.empty()) q.pop();
25     q.push(s);
26 
27     while(!q.empty())
28     {
29         s = q.front(); q.pop();
30 
31         for(int i = 0; i < 4; i++)
32         {
33             e.x = s.x + dir[i][0];
34             e.y = s.y + dir[i][1];
35             e.cnt = s.cnt + 1;
36             if(mapp[e.x][e.y] == '#' || vis[e.x][e.y]) continue;
37             //存储下到每个@时对应的e.cnt的值
38             if(mapp[e.x][e.y] == '@') dis[e.x][e.y][flag] = e.cnt;
39            // dis[e.x][e.y][flag] = e.cnt;
40             vis[e.x][e.y] = 1;
41             q.push(e);
42         }
43     }
44 }
45 
46 int main()
47 {
48     while(~scanf("%d %d", &n, &m))
49     {
50         memset(mapp, '#', sizeof(mapp));
51         memset(vis, 0, sizeof(vis));
52 
53         //刚开是这步初始化,结果WA了一发,好好思考为什么
54         //memset(dis, 0, sizeof(dis));
55 
56         for(int i = 1; i <= n; i++)
57         for(int j = 1; j <= m; j++)
58         dis[i][j][0] = dis[i][j][1] = inf;
59 
60         for(int i = 1; i <= n; i++)
61         for(int j = 1; j <= m; j++) scanf(" %c", &mapp[i][j]);
62 
63         min1 = inf;
64         for(int i = 1; i <= n; i++)
65         for(int j = 1; j <= m; j++)
66         {
67             if(mapp[i][j] == 'Y')
68             {
69                 flag = 0; //将flag标记为0,表示Y到@
70                 bfs(i, j);
71             }
72 
73             if(mapp[i][j] == 'M')
74             {
75                 flag = 1;
76                 bfs(i, j);
77             }
78         }
79 
80         for(int i = 1; i <= n; i++)
81         for(int j = 1; j <= m; j++)
82         {
83             //求出到每个@对应最小的时间
84             if(mapp[i][j] == '@') min1 = min(min1, dis[i][j][0]+dis[i][j][1]);
85         }
86         printf("%d
", min1 * 11); //结果*11即可
87     }
88     return 0;
89 }
View Code
原文地址:https://www.cnblogs.com/loveprincess/p/4872782.html