上次郭老师让大家帮忙找餐厅,今天他又来请大家帮忙了。郭老师想从自己的当前位置用最快的时间到达某一餐厅,他每次只能按照上、下、左、右四个方向移动,每次移动计为 1 个时间,但由于路况纷繁复杂,中间有很多的路障,导致他不得不绕过这些路障。此时,具有魔性的高老师出现了,他帮助郭老师在途中的某些点放置了穿梭机,任意两个穿梭机之间可以完成瞬间移动(瞬间移动不耗费时间)。
输入
第一行包含两个数字 n m(1 ≤ n, m ≤ 2000)
接下来包含 n 行,每行 m 个字符,表示现在的地图。'.' 表示空地,'M' 表示路障,'E' 表示穿梭机,'N' 表示郭老师当前所在的位置,'C' 表示要找的餐厅。'N' 和 'C' 在地图中出现且仅出现一次。
输出
郭老师最快多长时间能到达餐厅。如果永远到不了,输出 "Not Happy"。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 1024KB | 0 |
#include<stdio.h>//AC
#include<string.h>
char map[2005][2005] = { '\0' };
char vis[2005][2005] = { '\0' };//0-没走过;1-走过
int trend[4][2] = { { 1,0 },{ -1,0 },{ 0,1 },{ 0,-1 } };
int n, m, num=0;
struct CoordinateMode//坐标模式
{
short mx;
short my;
int step;
}Pass[2000000],Queue[4000000];//注意数组大小,有次queue的开2000000结果显示一个WA一个RE
struct CoordinateMode *head, *end;
struct CoordinateMode start;//记录N的位置
int Judge(struct CoordinateMode xx)//边界及限制判断
{
if (xx.my >= 1 && xx.my <= m && xx.mx >= 1 && xx.mx <= n && map[xx.mx][xx.my] != 'M' && vis[xx.mx][xx.my] != '1')
return 1;
else
return 0;
}
void Q_in(struct CoordinateMode ww)//添加队列
{
end++;
*end = ww;
vis[ww.mx][ww.my] = '1';
}
int Q_empty()//队列是否为空
{
if (head == end)
return 1;
else
return 0;
}
void Find()
{
memset(vis, '\0', sizeof(vis));
head = Queue;
end = Queue;
struct CoordinateMode now, next;
Q_in(start);
while (!Q_empty())
{
head++;
now = *head;
for (int i = 0; i<4; i++)
{
next.mx = trend[i][0] + now.mx;
next.my = trend[i][1] + now.my;
if (Judge(next))
{
next.step = now.step + 1;
if (map[next.mx][next.my] == 'C')
{
printf("%d\n", next.step);
return;
}
if (map[next.mx][next.my] == 'E')
{
for (int j = 0; j<num; j++)
{
Pass[j].step = next.step;
Q_in(Pass[j]);
}
}
else
Q_in(next);
}
}
}
printf("Not Happy\n");
}
int main()
{
char ch;
scanf("%d%d", &n, &m);
getchar();
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
ch = getchar();
map[i][j] = ch;
if (map[i][j] == 'N')
{
start.mx = i;
start.my = j;
start.step = 0;
}
if (map[i][j] == 'E')
{
Pass[num].mx = i;
Pass[num].my = j;
num++;
}
}
getchar();
}
Find();
return 0;
}