题目链接:https://vjudge.net/problem/HDU-2612
题意:‘@’表示KTV,‘#’表示无法走的地方,‘Y’,'M’表示两个人,他们要在KTV见面,问他们都到达KTV要花费的时间之和。
思路:两个bfs,一个从‘M’开始,一个从‘Y’开始,跑完之后,遍历地图,找出所有KTV,并记录最短用时。
1 #include <iostream> 2 #include <cstring> 3 #include<vector> 4 #include<string> 5 #include <cmath> 6 #include <map> 7 #include <queue> 8 #include <algorithm> 9 using namespace std; 10 11 #define inf (1LL << 31) - 1 12 #define rep(i,j,k) for(int i = (j); i <= (k); i++) 13 #define rep__(i,j,k) for(int i = (j); i < (k); i++) 14 #define per(i,j,k) for(int i = (j); i >= (k); i--) 15 #define per__(i,j,k) for(int i = (j); i > (k); i--) 16 17 const int N = 210; 18 int mv_x[] = { 0, 0, -1, 1 }; 19 int mv_y[] = { 1, -1, 0, 0 }; 20 int spent[N][N]; //两个人跑出的花费记录在这 21 bool vis[N][N]; 22 char mp[N][N]; 23 int n, m; 24 int yi, yj, mi, mj; //两个人的坐标 25 26 struct node{ 27 28 int x, y, v; 29 }; 30 31 inline void init(){ 32 rep(i, 1, n) rep(j, 1, m) spent[i][j] = 0; 33 } 34 35 void input(){ 36 rep(i, 1, n){ 37 rep(j, 1, m){ 38 cin >> mp[i][j]; 39 if (mp[i][j] == 'M') mi = i, mj = j; 40 else if (mp[i][j] == 'Y') yi = i, yj = j; 41 } 42 } 43 } 44 45 //是否越界 46 inline bool check(int x, int y){ 47 return x >= 1 && x <= n && y >= 1 && y <= m; 48 } 49 50 void bfs(int pi, int pj){ 51 52 rep(i, 1, n) rep(j, 1, m) vis[i][j] = false;//初始化vis[][] 53 54 queue<node > que; 55 vis[pi][pj] = true; 56 que.push(node{ pi, pj, 1 }); 57 58 while (!que.empty()){ 59 60 node tmp = que.front(); 61 que.pop(); 62 63 rep__(p, 0, 4){ 64 int dx = tmp.x + mv_x[p]; 65 int dy = tmp.y + mv_y[p]; 66 67 if (check(dx, dy) && !vis[dx][dy] && mp[dx][dy] != '#'){ 68 vis[dx][dy] = true; 69 spent[dx][dy] += tmp.v; //花费时间叠加 70 que.push(node{ dx, dy, tmp.v + 1 }); 71 } 72 } 73 } 74 } 75 76 void get_ans(){ 77 78 int ans = inf; 79 //如果spent[][] == 0 说明该‘@’无法到达,需要特判 80 rep(i, 1, n){ 81 rep(j, 1, m){ 82 if (spent[i][j] && mp[i][j] == '@'){ 83 ans = min(ans, spent[i][j]); 84 } 85 86 } 87 } 88 cout << ans * 11 << endl; 89 } 90 91 int main(){ 92 93 ios::sync_with_stdio(false); 94 cin.tie(0); 95 96 while (cin >> n >> m){ 97 98 init();//初始化 99 input();//输入 100 bfs(yi, yj);//第一个人 101 bfs(mi, mj);//第二个人 102 get_ans();//得到答案 103 } 104 105 return 0; 106 }