题意 在n*m的地图中 ‘Y’和‘M‘两个人到某一家KFC(在地图上用"@‘表示) 所需的最小时间和是多少 他们每走一步都要11分钟
可以分别以y和m为起点进行一遍bfs 把到每个KFC的时间都存起来 最后看哪家KFC的时间和最小就行了
#include <map> #include <cstdio> #include <algorithm> using namespace std; const int N = 205; int x[] = {0, 0, -1, 1}; int y[] = { -1, 1, 0, 0}; pair<int, int> q[N * N]; int dy[N][N], dm[N][N], ans, n, m; char g[N][N]; void bfs(int r, int c, char k) { int (&d)[N][N] = (k == 'Y' ? dy : dm); //d为指向dy或dm的引用 int v[N][N] = {0}, le = 0, ri = 0, cr, cc; q[ri++] = make_pair(r, c), v[r][c] = 1, d[r][c] = 0; while(le < ri) { r = q[le].first, c = q[le++].second; for(int i = 0; i < 4; ++i) { cr = r + x[i], cc = c + y[i]; if(cr >= 0 && cr < n && cc >= 0 && cc < m && v[cr][cc] == 0 && g[cr][cc] != '#') q[ri++] = make_pair(cr, cc), d[cr][cc] = d[r][c] + 1, v[cr][cc] = 1; } } } int main() { while(~scanf("%d%d", &n , &m)) { ans = N * N; for(int i = 0; i < n; ++i) scanf("%s", g[i]); for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j) if(g[i][j] == 'Y' || g[i][j] == 'M') bfs(i, j, g[i][j]); for(int i = 0; i < n; ++i) for(int j = 0; j < m; ++j) if(g[i][j] == '@') ans = min(ans, dy[i][j] + dm[i][j]); printf("%d\n", ans * 11); } return 0; }
4 4 Y.#@ .... .#.. @..M 4 4 Y.#@ .... .#.. @#.M 5 5 Y..@. .#... .#... @..M. #...#
66 88 66
原文地址:http://blog.csdn.net/acvay/article/details/44788045