题意:求Y和M到达同一个@的最短时间和
思路:分别算Y和M到达每一个@的最短时间,然后组合比较,选出总和最小即可
代码如下:
#include<cstdio>
#include<cstring>
#include<queue>
#include<string>
using namespace std;
#define INF 1e7+9
typedef long long ll;
const int N = 210;
int n, m;
char map[N][N];
int vis1[N][N], vis2[N][N], ans1[N][N], ans2[N][N];
int f[4][2] = {0, 1, 1, 0, 0, -1, -1, 0};
struct node
{
int x, y;
};
node s1, s2;
bool ok(node b)
{
if(b.x >= 0 && b.x < n && b.y >= 0 && b.y < m && map[b.x][b.y] != '#')
return true;
return false;
}
void bfs(node s, int vis[N][N], int ans[N][N])
{
node nex;
vis[s.x][s.y] = 1;
ans[s.x][s.y] = 0;
queue<node>q;
q.push(s);
while(!q.empty())
{
node a = q.front();
q.pop();
for(int i = 0; i < 4; i++)
{
nex.x = a.x + f[i][0];
nex.y = a.y + f[i][1];
if(ok(nex)&& !vis[nex.x][nex.y])
{
ans[nex.x][nex.y] = ans[a.x][a.y] + 1;
vis[nex.x][nex.y] = 1;
q.push(nex);
}
}
}
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
int t = 0;
for(int i = 0; i < n; i++)
{
getchar();
for(int j = 0; j < m; j++)
{
scanf("%c", &map[i][j]);
if(map[i][j] == 'Y') s1.x = i, s1.y = j;
else if(map[i][j] == 'M') s2.x = i, s2.y = j;
}
}
memset(vis1, 0, sizeof(vis1));
memset(ans1, 0, sizeof(ans1));
bfs(s1, vis1, ans1);
memset(vis2, 0, sizeof(vis2));
memset(ans2, 0, sizeof(ans2));
bfs(s2, vis2, ans2);
int minx = INF;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
if(map[i][j] == '@' && vis1[i][j] && vis2[i][j])
minx = min(minx, ans1[i][j] + ans2[i][j]);
}
printf("%d\n", minx * 11);
}
return 0;
}