HDU 2612 Find a way(找条路)
HDU 2612 Find a way(找条路)
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description - 题目描述
Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year, yifenfei have many people to meet. Especially a good friend Merceki.
Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city. So yifenfei made arrangements with Merceki to meet at a KFC. There are many KFC in Ningbo, they want to choose one that let the total time to it be most smallest.
Now give you a Ningbo map, Both yifenfei and Merceki can move up, down ,left, right to the adjacent road by cost 11 minutes.
Yifenfei’s home is at the countryside, but Merceki’s home is in the center of city. So yifenfei made arrangements with Merceki to meet at a KFC. There are many KFC in Ningbo, they want to choose one that let the total time to it be most smallest.
Now give you a Ningbo map, Both yifenfei and Merceki can move up, down ,left, right to the adjacent road by cost 11 minutes.
经过一年在杭州的学习,yifenfei终于回到了家乡宁波。离开宁波一年,yifenfei有许多人需要拜访。特别是好基友Merceki。
Yifenfei家住郊区,然而Merceki则住在市中心。因此yifenfei打算约Merceki在KFC面基,不过他们要选一家到达所花费的时间和最短的店。
现在给你一张宁波地图,yifenfei和Merceki可以花费11分钟分别进行上下左右移动。
Input - 输入
The input contains multiple test cases.
Each test case include, first two integers n, m. (2<=n,m<=200).
Next n lines, each line included m character.
‘Y’ express yifenfei initial position.
‘M’ express Merceki initial position.
‘#’ forbid road;
‘.’ Road.
‘@’ KCF
Each test case include, first two integers n, m. (2<=n,m<=200).
Next n lines, each line included m character.
‘Y’ express yifenfei initial position.
‘M’ express Merceki initial position.
‘#’ forbid road;
‘.’ Road.
‘@’ KCF
输入有多组测试用例。 每组用例开头为两个整数n,m。(2<=n,m<=200) 随后n行,每行有m个字符。 ‘Y’表示yifenfei 的初始位置。 ‘M’表示Merceki 的初始位置。 ‘#’障碍物 ‘.’道路 ‘@’ KCF
Output - 输出
For each test case output the minimum total time that both yifenfei and Merceki to arrival one of KFC.You may sure there is always have a KFC that can let them meet.
对于每个测试用例,输出yifenfei 与Merceki 到达某个KFC最少的二者时间和。至少存在一个KFC让他们相遇。
Sample Input - 输入样例
4 4 Y.#@ .... .#.. @..M 4 4 Y.#@ .... .#.. @#.M 5 5 Y..@. .#... .#... @..M. #...#
Sample Output - 输出样例
66 88 66
题解
BFS套路,扫两遍出结果。
需要注意无法达到的KFC,可以通过处理最大值来规避。
代码 C++
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define INF 0x01010101 6 struct Point{ 7 int y, x; 8 }st1, st2, kfc[405], now, nxt; 9 std::queue<Point> q; 10 int data[205][205], iK, len[405], fx[8] = { 1, 0, -1, 0, 0, 1, 0, -1 }; 11 char map[205][205]; 12 void BFS(char c, char b){ 13 int i, tmp; 14 while (!q.empty()){ 15 now = q.front(); q.pop(); tmp = data[now.y][now.x] + 1; 16 for (i = 0; i < 8; i += 2){ 17 nxt.y = now.y + fx[i]; nxt.x = now.x + fx[i + 1]; 18 if (map[nxt.y][nxt.x] == c){ 19 data[nxt.y][nxt.x] = tmp; map[nxt.y][nxt.x] = b; 20 q.push(nxt); 21 } 22 } 23 } 24 for (i = 0; i < iK; ++i) len[i] += data[kfc[i].y][kfc[i].x]; 25 } 26 int main(){ 27 int n, m, i, j, opt; 28 while (~scanf("%d%d ", &n, &m)){ 29 memset(map, '#', sizeof map); memset(len, 0, sizeof len); 30 iK = 0; opt = INF; 31 for (i = 1; i <= n; ++i) gets(&map[i][1]); 32 for (i = 1; i <= n; ++i) for (j = 1; j <= m; ++j){ 33 switch (map[i][j]){ 34 case 'Y': st1 = { i, j }; map[i][j] = '.'; break; 35 case 'M': st2 = { i, j }; map[i][j] = '.'; break; 36 case '@': kfc[iK++] = { i, j }; map[i][j] = '.'; 37 } 38 } 39 40 memset(data, INF, sizeof data); 41 q.push(st1); data[st1.y][st1.x] = 0; map[st1.y][st1.x] = '*'; 42 BFS('.', '*'); 43 44 memset(data, INF, sizeof data); 45 q.push(st2); data[st2.y][st2.x] = 0; map[st2.y][st2.x] = 'X'; 46 BFS('*', 'X'); 47 48 for (i = 0; i < iK; ++i) opt = std::min(opt, len[i]); 49 printf("%d\n", opt * 11); 50 } 51 return 0; 52 }