HDU-2612.Find way .(不同起点不同终点的BFS)

  我要被这个好用的memset气死了......

  真香

#include <cstring>
#include <string>
int main () { string a[10]; memset(a, "真香", sizeof(a)); }

 

  这道题也是出现了和昨天一样的情况,半小时写完,改bug改了1个小时,结果最后啸神说memeset不能随便给大数赋值,结果一改就改对了emm,真的是要被自己菜死了。

  本题大意:给定一张地图,Y和M同时走向附近的KFC,找出Y和M距离和最短的KFC并输出他们所用时间的和。

  本题思路:从Y,M开始BFS,记录他们到所有KFC的距离,选择最小的输出即可。

  本题代码:

 1 #include <cstdio>
 2 #include <queue>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <vector>
 6 using namespace std;
 7 
 8 typedef pair<int , int > P;
 9 const int mini = 11, maxn = 200 + 5, INF = 0x3f3f3f3f;
10 int n, m, ans;
11 char maze[maxn][maxn];
12 int disy[maxn][maxn], dism[maxn][maxn];//存储Y和M到KFC的距离
13 bool flag;//作用为判断当前进行BFS的是Y还是M
14 
15 void bfs(int u, int v) {
16     queue <P> s;
17     s.push(make_pair(u, v));
18     while(!s.empty()) {
19         P p = s.front();
20         s.pop();
21         for(int dx = -1; dx <= 1; dx ++) {
22             for(int dy = -1; dy <= 1; dy ++) {
23                 if(abs(dx) != abs(dy)) {
24                     int nx = p.first + dx, ny = p.second + dy;
25                     if(nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] != '#') {
26                         if(!flag) {
27                             if(disy[nx][ny] == INF) {
28                                 s.push(make_pair(nx, ny));
29                                 disy[nx][ny] = disy[p.first][p.second] + 1;
30                             }
31                         } else {
32                             if(dism[nx][ny] == INF) {
33                                 s.push(make_pair(nx, ny));
34                                 dism[nx][ny] = dism[p.first][p.second] + 1;
35                             }
36                         }
37                     }
38                 }
39             }
40         }
41     }
42 }
43 
44 int main () {
45     while(scanf("%d %d", &n, &m) == 2) {
46         ans = INF;
47         flag = false;
48         memset(disy, INF, sizeof(disy));//一般情况下memset别给除0, -1以外的其它值赋值,INF取0x3f3f3f3f时可以用memset赋值
49         memset(dism, INF, sizeof(dism));
50         vector <P> kfc;
51         P Y, M;
52         getchar();
53         for(int i = 0; i < n; i ++) {
54             for(int j = 0; j < m; j ++) {
55                 maze[i][j] = getchar();
56                 if(maze[i][j] == '@')
57                     kfc.push_back(make_pair(i, j));
58                 if(maze[i][j] == 'Y')
59                     Y = make_pair(i, j);
60                 if(maze[i][j] == 'M')
61                     M = make_pair(i, j);
62             }
63             getchar();
64         }
65         disy[Y.first][Y.second] = 0;
66         dism[M.first][M.second] = 0;
67         bfs(Y.first, Y.second);
68         flag = true;
69         bfs(M.first, M.second);
70         for(vector <P> :: iterator i = kfc.begin(); i != kfc.end(); i ++) {
71             disy[i -> first][i -> second] += dism[i -> first][i -> second];
72             if(disy[i -> first][i -> second] < ans && disy[i -> first][i -> second] > 0)
73                 ans = disy[i -> first][i -> second];
74         }
75         printf("%d\n", mini * ans);
76     }
77     return 0;
78 }
View Code

 

posted @ 2019-03-05 14:25  Cruel_King  阅读(167)  评论(0编辑  收藏  举报