NC14608-after与迷宫(双BFS)

该博客介绍了如何使用双BFS策略解决一个迷宫问题。在迷宫中,主角after必须避开墨菲斯托和莉莉丝的存在,从入口到达含有算法书的房间并返回,同时避免变成超级YK机器人。文章详细阐述了错误的解决方案以及正确的双BFS算法,确保在不遇到两者的情况下找到最短路径。如果无法找到这样的路径,则输出"IMPOSSIBLE"。
摘要由CSDN通过智能技术生成

after与迷宫-NC14608(两次bfs)
after的算法书的遗落在一个叫做AIJ的迷宫中了,这个迷宫有N*M个房间,迷宫的入口为(1,1),算法书遗落在(r,c)。迷宫中的房间有四种状态:空房间、无法进入的房间、有墨菲斯托存在的房间和有莉莉丝存在的房间。墨菲斯托会否定一切,而莉莉丝会诱惑人做一种叫做YK的活动。after是一个意志薄弱的人,他遇到了墨菲斯托和莉莉丝之后,便会变成眼神空洞的超级YK机器人。after每步可以从他当前的房间走至上下左右四个房间的其中一个房间。after害怕变成超级YK机器人,所以要尽快拿到算法书然后从入口逃离。问after最少需要走多少步才可以在不变成超级YK机器人的情况下从入口出发取回算法书并逃离迷宫?

输入描述:
第一行一个正整数T(T<=10),表示共有T组数据。对于每组数据,第一行四个正整数N,M,r,c(1<=N,M<=1000;1<=r<=N;1<=c<=M)。接下来N行,每行M个字符,每个表示房间的状态,“.”表示空房间,“*”表示无法进入的房间,“F”表示有墨菲斯托存在的房间,“M”表示有莉莉丝存在的房间。数据保证(1,1)为“.”。
输出描述:
对每组数据输出一行,即after最少需要走的步数。若after无法取回算法书,则输出“IMPOSSIBLE”(不带引号)。

输入:
1
4 4 4 3
…**
*F…

*M.F
输出:
14

思路:

因为一条路不能都有F和M,所以用两个bfs,一个不走M,一个不走F,最后取两个较小值。

一开始的错误想法

一开始想着用双bool判断当前这条路是否已经走过F和M,敲着敲着感到不对劲,bfs会将已经走过的地方标记,我的方法也没办法避免这个情况,如果短的路和长的路有共同的一部分,如果短的路之前有过F,走到共同部分遇到M,那么短的路失效,但是此时公共节点已经标记过,所以长的路就算最终满足条件也走不下去。例如:
在这里插入图片描述

红色路程短但不满足,当红色走到M时不符合题意,但M的前一节点(也就是M上面的点)已标记走过,所以蓝色的路被阻止,题目无解。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 1000 +10;
int ex,ey;
int n,m,t;
char mp[M][M];
int vis[M][M];
bool FF,FM;
int dir[4][4]={
   0,1,0,-1,1,0,-1,0};
struct node
{
   
    int step;
    int x;
    int y;
};
bool Judge()
{
   
    if(FF&&FM)
        return false;
    return true;
}
void BFS(int x,int y)
{
   
    queue<node>pp;
    node qwe;
    qwe.step=0; qwe.x=x; qwe.y=y;
    pp.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值