题目描述
暑假即将到来,鱼大大和羊大大计划吃肯德基。他们在计划中在某一天选择了某一个肯德基吃午饭。
到了约定的日子,鱼大大和羊大大都是9点出发,向KFC前进,问他们两能否在中午12点之前到达约定的KFC?如果可以,那么他们最少花费多少分钟就能在KFC相约?
约定:
时间计算:起点到终点的距离为时间,即走1单位的距离,鱼大大和羊大大都要花费1分钟的时间。
‘@’ 是鱼大大的位置,‘#’ 是障碍,‘F’ 表示KFC,‘&’ 表示羊大大的位置。
‘.’,‘F’,‘@’ 和 ‘&’,这些位置都可以通过。
输入格式
第一行包含两个整数 n 和 m。
接下来的 n 行,每行输入 m 个字符来表示地图。(1 ≤ n ≤ m ≤ 200)
输出格式
如果能找到一条可行的路径并在在12点之前到达KFC,输出花费的最少时间,否则输出 “Meeting cancelled”(两人无法在12点之前相约在此KFC)。
样例
Input 1
4 4 @.#. … .#… F…&
Output 1
3
数据范围
见题面
样例过了,但WA 40!!!
代码:
#include <bits/stdc++.h>
using namespace std;
int n, m, yx1, yy1, yx2, yy2, fx, fy, ans, bfs(int, int);
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
char mp[205][205];
struct node
{
int x, y, step;
};
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> mp[i][j];
if (mp[i][j] == '@')
{
yx1 = i;
yy1 = j;
}
else if (mp[i][j] == 'F')
{
fx = i;
fy = j;
}
else if (mp[i][j] == '&')
{
yx2 = i;
yy2 = j;
}
}
}
ans = max(bfs(yx1, yy1), bfs(yx2, yy2));
if (ans > 180)
{
printf("Meeting cancelled");
}
else
{
printf("%d", ans);
}
return 0;
}
int bfs(int sx, int sy)
{
int vis[205][205];
queue<node> que;
vis[sx][sy] = 1;
que.push({sx, sy, 0});
while (!que.empty())
{
node hd = que.front();
que.pop();
for (int i = 0; i < 4; i++)
{
int x = hd.x + dx[i], y = hd.y + dy[i], step = hd.step + 1;
if (x < 1 || x > n || y < 1 || y > m || mp[x][y] == '#' || vis[x][y])
{
continue;
}
if (x == fx && y == fy)
{
return step;
}
vis[x][y] = 1;
que.push({x, y, step});
}
}
}