解题思路:本题可以分别对小 Y 和小 M进行bfs,并保存他们各自到每个点的距离,然后枚举每一个餐厅的总距离,取最小即可
C++代码
#include <bits/stdc++.h>
using namespace std;
const int N = 210;
typedef pair<int, int> PII;
PII role1, role2;
char g[N][N];
int dist_1[N][N], dist_2[N][N];
int n, m;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
void bfs(int dist[N][N], PII role)
{
queue<PII> q;
q.push(role);
dist[role.first][role.second] = 0;
while (q.size())
{
auto t = q.front();
q.pop();
for (int i = 0; i < 4; i ++ )
{
int a = t.first + dx[i], b = t.second + dy[i];
if (a >= 0 && a < n && b >= 0 && b < m && dist[a][b] == 0x3f3f3f3f && g[a][b] != '#')
{
dist[a][b] = dist[t.first][t.second] + 1;
q.push({a, b});
}
}
}
}
int main()
{
while (cin >> n >> m)
{
memset(dist_1, 0x3f, sizeof dist_1);
memset(dist_2, 0x3f, sizeof dist_2);
int minn = 2e9;
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < m; j ++ )
{
cin >> g[i][j];
if (g[i][j] == 'Y') role1 = {i, j};
if (g[i][j] == 'M') role2 = {i, j};
}
}
bfs(dist_1, role1);
bfs(dist_2, role2);
for (int i = 0; i < n; i ++ )
{
for (int j = 0; j < m; j ++ )
{
if (g[i][j] == '@')
{
int all_dist = dist_1[i][j] + dist_2[i][j];
if (all_dist < minn) minn = all_dist;
}
}
}
cout << minn * 11 << endl;
}
return 0;
}
创作不易,大家可以在AcWing注册账号,参与一下AC之星计划,我的邀请码是MYRGS。对题解有任何疑问可以在评论区下面评论