题目链接:Find a way
bfs水题。
1 /* 2 只有两个人啊。分别以两个人为起点bfs,计算出每个人到每个KFC 的时间。两个人都能到达的KFC的较大时间的最小值、就是ans。好水。T_T 3 */ 4 5 #include <stdio.h> 6 #include <string.h> 7 #include <iostream> 8 #include <string> 9 #include <queue> 10 #define maxn 1000000 11 using namespace std; 12 13 char mp[210][210]; 14 int vis[210][210]; 15 int step[210][210], step1[210][210], step2[210][210]; 16 int n, m; 17 18 struct Node{ 19 int x, y; 20 }now, temp, a, b; 21 22 queue<Node>que; 23 24 int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1}; 25 26 bool check(Node a) { 27 if (a.x >= 0 && a.x < n && a.y >= 0 && a.y < m && !vis[temp.x][temp.y] && mp[temp.x][temp.y] != '#') 28 return true; 29 return false; 30 } 31 32 void bfs1(Node t) { 33 while(!que.empty()) { 34 que.pop(); 35 } 36 memset(vis, 0, sizeof(vis)); 37 que.push(t); 38 vis[t.x][t.y] = 1; 39 step1[t.x][t.y] = 0; 40 41 while(!que.empty()) { 42 now = que.front(); 43 que.pop(); 44 for (int i=0; i<4; ++i) { 45 temp.x = now.x + dir[i][0]; 46 temp.y = now.y + dir[i][1]; 47 if (check(temp)) { 48 vis[temp.x][temp.y] = 1; 49 step1[temp.x][temp.y] = step1[now.x][now.y] + 1; 50 que.push(temp); 51 } 52 } 53 } 54 } 55 56 void bfs2(Node t) { 57 while(!que.empty()) { 58 que.pop(); 59 } 60 memset(vis, 0, sizeof(vis)); 61 que.push(t); 62 vis[t.x][t.y] = 1; 63 step2[t.x][t.y] = 0; 64 65 while(!que.empty()) { 66 now = que.front(); 67 que.pop(); 68 for (int i=0; i<4; ++i) { 69 temp.x = now.x + dir[i][0]; 70 temp.y = now.y + dir[i][1]; 71 if (check(temp)) { 72 vis[temp.x][temp.y] = 1; 73 step2[temp.x][temp.y] = step2[now.x][now.y] + 1; 74 que.push(temp); 75 } 76 } 77 } 78 } 79 80 int main() { 81 while(cin >> n >> m) { 82 memset(vis, 0, sizeof(vis)); 83 for (int i=0; i<n; ++i) { 84 for (int j=0; j<m; ++j) { 85 step[i][j] = maxn; 86 step1[i][j] = maxn; 87 step2[i][j] = maxn; 88 } 89 } 90 for (int i=0; i<n; ++i) { 91 for (int j=0; j<m; ++j) { 92 cin >> mp[i][j]; 93 if (mp[i][j] == 'M') { 94 a.x = i, a.y = j; 95 } 96 else if (mp[i][j] == 'Y') { 97 b.x = i, b.y = j; 98 } 99 } 100 } 101 102 bfs1(a); 103 bfs2(b); 104 int ans = maxn; 105 for (int i=0; i<n; ++i) { 106 for (int j=0; j<m; ++j) { 107 if (mp[i][j] == '@') { 108 step[i][j] = step1[i][j] + step2[i][j]; 109 } 110 ans = min(ans, step[i][j]); 111 } 112 } 113 cout << ans*11 << endl; 114 } 115 return 0; 116 }