题意 在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