这道题的思路就是使用两次bfs,用二维数组保存从起点到不同位置的时间,最后看两个人是否都能到达同一个kfc,如果能够达到同一个,就不断更新答案.
题目链接
#include <cstdio>
#include <queue>
#include <cstring>
#include <utility>
#include <climits>
using namespace std;
const int MAX = 2e2 + 5;
char _map[MAX][MAX];
int r, c;
int dir[][2] = { {0,-1},{-1,0},{0,1},{1,0} }; //四个方向
void bfs(pair<int, int> sour, int time[][MAX])
{
queue<pair<int, int>> que;
que.push(sour);
while (!que.empty())
{
pair<int, int> from;
sour = que.front(); que.pop();
for (int i = 0; i < 4; i++)
{
from.first = sour.first + dir[i][0], from.second = sour.second + dir[i][1];
if (('.' == _map[from.first][from.second] || '@' == _map[from.first][from.second]) && INT_MAX == time[from.first][from.second]) {
time[from.first][from.second] = time[sour.first][sour.second] + 1;
que.push(from);
}
}
}
}
int main()
{
int time1[MAX][MAX], time2[MAX][MAX]; //两个时间二维数组
//time1保存Y到各个点的最短时间,time2保存M到各个点的最短时间
while (~scanf("%d%d", &r, &c))
{
memset(_map, '#', sizeof _map); //初始化
for (int i = 0; i <= r + 1; i++)
for (int j = 0; j <= c + 1; j++)
time1[i][j] = time2[i][j] = INT_MAX;
for (int i = 1; i <= r; i++)
scanf("%s", _map[i] + 1);
pair<int, int> sour1, sour2; //两个人的初始坐标保存在sour1,sour2
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
if ('Y' == _map[i][j]) {
sour1.first = i, sour1.second = j;
time1[i][j] = 0; _map[i][j] = '.'; break;
}
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
if ('M' == _map[i][j]) {
sour2.first = i, sour2.second = j;
time2[i][j] = 0; _map[i][j] = '.'; break;
}
bfs(sour1, time1);
bfs(sour2, time2); //两次bfs分别得到两个人到达不同位置的时间
int res = INT_MAX;
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
{
if ('@' == _map[i][j] && INT_MAX!=time1[i][j] && INT_MAX!=time2[i][j]) {
int ans = time1[i][j] + time2[i][j];
if (ans < res)
res = ans;
}
}
printf("%d\n", res * 11);
}
return 0;
}