kuangbin带你飞——专题一 简单搜索(14)
题目来源:HDU 2612 Find a way
题解
分别计算 yifenfei 和 Merceki 到达 KFC 所用的时间。ans = min { time(yifenfei) + time (Mercekei) }。
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 205;
#define inf 0x3f3f3f3f
// mp 地图数组,visy yifenfei的标记数组,vism Merceki的标记数组
int mp[maxn][maxn], visy[maxn][maxn], vism[maxn][maxn];
// timy yifenfei通过的路的最短时间,timm Merceki通过的路的最短时间
int timy[maxn][maxn], timm[maxn][maxn];
// 方向数组
int dx[] = {-1, 1, 0, 0},
dy[] = {0, 0, -1, 1};
struct point
{
int x, y;
int tim;
};
// 初始化数组
void init()
{
memset(mp, 0, sizeof(mp));
memset(visy, 0, sizeof(visy));
memset(vism, 0, sizeof(vism));
memset(timy, inf, sizeof(timy));
memset(timm, inf, sizeof(timm));
}
void solve(point starty, point startm)
{
// yifenfei 遍历路程
queue<point> q;
visy[starty.x][starty.y] = 1;
timy[starty.x][starty.y] = 0;
q.push(starty);
while (!q.empty())
{
point p = q.front();
q.pop();
point tmp;
for (int i = 0; i < 4; ++i)
{
tmp.x = p.x + dx[i], tmp.y = p.y + dy[i], tmp.tim = p.tim + 11;
if (mp[tmp.x][tmp.y] && !visy[tmp.x][tmp.y] && timy[tmp.x][tmp.y] > tmp.tim)
{
visy[tmp.x][tmp.y] = 1;
timy[tmp.x][tmp.y] = tmp.tim;
q.push(tmp);
}
}
}
// 退点
while (!q.empty())
{
q.pop();
}
// Merceki 遍历路程
vism[startm.x][startm.y] = 1;
timm[startm.x][startm.y] = 0;
q.push(startm);
while (!q.empty())
{
point p = q.front();
q.pop();
point tmp;
for (int i = 0; i < 4; ++i)
{
tmp.x = p.x + dx[i], tmp.y = p.y + dy[i], tmp.tim = p.tim + 11;
if (mp[tmp.x][tmp.y] && !vism[tmp.x][tmp.y] && timm[tmp.x][tmp.y] > tmp.tim)
{
vism[tmp.x][tmp.y] = 1;
timm[tmp.x][tmp.y] = tmp.tim;
q.push(tmp);
}
}
}
}
int main()
{
int n, m;
while (~scanf("%d%d", &n, &m))
{
point sy, sm;
string str;
init();
// 控制输入
for (int i = 1; i <= n; ++i)
{
cin >> str;
for (int j = 1; j <= m; ++j)
{
if (str[j - 1] == 'Y')
{
sy = {i, j, 0};
mp[i][j] = 1;
}
else if (str[j - 1] == 'M')
{
sm = {i, j, 0};
mp[i][j] = 1;
}
else if (str[j - 1] == '#')
{
}
else if (str[j - 1] == '.')
{
mp[i][j] = 1;
}
else if (str[j - 1] == '@')
{
mp[i][j] = 2;
}
}
}
solve(sy, sm);
// 选取最短时间
int ans = inf;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
{
if (mp[i][j] == 2 && ans > timy[i][j] + timm[i][j])
ans = timy[i][j] + timm[i][j];
}
}
printf("%d\n", ans);
}
return 0;
}