HDU
来源:互联网 发布:网络犯罪举报中心 编辑:程序博客网 时间:2024/05/17 23:54
题意:Y,M两个人要去KFC一起吃个饭,'@'表示KFC。问Y,M每走一步花费11的体力,他俩花费最少的体力为多少?KFC有多个,保证至少有一个KFC是他俩都能到达的。
思路:BFS。两个人都跑一遍地图,存一下每个人到每个点的最小步数。然后从是'@'的点的中求一个最小值。
注意:要把存步数那个数组赋初值为极大值。赋0会wa。因为可能有一个点他俩都到不了,赋0的话最小步数会求一个得0。
#include<bits/stdc++.h>using namespace std;const int INF = 0x3f3f3f;const int MAXN = 205;int n, m;char MAP[MAXN][MAXN];int STEP[2][MAXN][MAXN], dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};struct Point{ int x, y, step;}NOW,NEXT;bool vis[MAXN][MAXN];void bfs(int sx, int sy, int people)//people=0,1代表Y,M{ memset(vis, 0, sizeof(vis)); queue<Point> q; NOW.x = sx; NOW.y = sy; NOW.step = 0; vis[sx][sy] = true; q.push(NOW); while (!q.empty()) { NOW = q.front(); q.pop(); STEP[people][NOW.x][NOW.y] = NOW.step;//记录people步数 for(int i = 0; i < 4; i++) { int X = NOW.x + dir[i][0], Y = NOW.y + dir[i][1]; if(X >= 0 && Y >= 0 && X < n && Y < m && MAP[X][Y] != '#' && !vis[X][Y]) { vis[X][Y] = true; NEXT.x = X; NEXT.y = Y; NEXT.step = NOW.step + 1; q.push(NEXT); } } }}int main(){ while (~scanf("%d%d", &n, &m)) { int x1, x2, y1, y2; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> MAP[i][j]; if(MAP[i][j] == 'Y') { x1 = i; y1 = j; } else if(MAP[i][j] == 'M') { x2 = i; y2 = j; } } } memset(STEP, INF, sizeof(STEP));//步数赋值为极大值,注意memset用法 bfs(x1, y1 ,0);//Y跑一遍图 bfs(x2, y2 ,1);//M跑一遍图 int MIN = INF;//求最小值 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if(MAP[i][j] == '@') { MIN = min(MIN, STEP[0][i][j] + STEP[1][i][j]); } } } printf("%d\n", MIN * 11); } return 0;}/*4 4Y.#@.....#..@..M4 4Y.#@.....#..@#.M5 5Y..@..#....#...@..M.#...#*/
阅读全文