NEFU 1214 逃出迷宫 (BFS寻径)

题意:

中文

思路:
两种思路:
1》火先走完人再走——先BFS火堆,将图染色,标记到某一点的时间,再BFS人的行走路径。

2》火和人一起走——同时BFS火和人

代码:(只给出思路2)

#include <iostream>
#include <queue>
#include <cstdio>
using namespace std;
typedef struct Node{
    int x;int y;int step;
    Node(int xx=0,int yy=0,int ss=0){
        x=xx;y=yy;step=ss;
    }
}Node;
const int MAXN=1e4;
char a[MAXN][MAXN];
int n,m,now,ans,Mp[MAXN][MAXN];
queue <Node> fir;
queue <Node> mov;
int dir_x[4]={0,1,-1,0};
int dir_y[4]={1,0,0,-1};
void burn(){
    Node t;
    int x,y;
    while(!fir.empty()){
        t=fir.front();
        if(t.step>now) break;
        fir.pop();
        for(int i=0;i<4;i++){
            x=t.x+dir_x[i];
            y=t.y+dir_y[i];
            if(x<1||x>n||y<1||y>m) continue;
            if(Mp[x][y]==0||Mp[x][y]==1){
                fir.push(Node(x,y,t.step+1));
                Mp[x][y]=-1;
            }
        }
    }
    return ;
}
int move(){
    Node t;
    int x,y;
    while(!mov.empty()){
        t=mov.front();
        if(t.step>now) return 0;
        mov.pop();
        for(int i=0;i<4;i++){
            x=t.x+dir_x[i];
            y=t.y+dir_y[i];
            if(x<1||x>n||y<1||y>m) return 1;
            if(Mp[x][y]==0){
                mov.push(Node(x,y,t.step+1));
                Mp[x][y]=1;
            }
        }
    }
    return -1;
}
void solve(){
    now=1;
    while(1){
        burn();

        int res=move();
        if(res==-1){
            ans=0;
            break;
        }else if(res==0){
            now++;
            continue;
        }else if(res==1){
            ans=now;
            break;
        }
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d %d",&n,&m);
        getchar();
        while(!fir.empty()) fir.pop();
        while(!mov.empty()) mov.pop();
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%c",&a[i][j]);
                if(a[i][j]=='J'){
                    Mp[i][j]=0;
                    mov.push(Node(i,j,1));
                }else if(a[i][j]=='.'){
                    Mp[i][j]=0;
                }else if(a[i][j]=='#'){
                    Mp[i][j]=-1;
                }else{
                    Mp[i][j]=-2;
                    fir.push(Node(i,j,1));
                }
            }
            getchar();
        }
        solve();
        if(ans){
            printf("%d\n",ans);
        }else{
            puts("IMPOSSIBLE");
        }
    }
}


Description

你的任务是帮助小明逃出迷宫,迷宫中有一个小明的位置,有障碍(不确定个数,障碍不允许人和火堆蔓延),有空地(不确定个数),有火堆(不确定个数),
小明每分钟可以走上下左右四个位置,火堆每分钟可以向旁边的空地蔓延,当小明走出迷宫的边界格子则代表小明逃出迷宫如果小明不可能走出迷宫,则输出IMPOSSIBLE,
否者输出逃出迷宫的最少时间(分钟)

Input

输入组数T,每组有R和C,代表R行C列,然后‘#’代表障碍,‘.’代表空地,‘J’代表小明(保证只有一个),‘F’代表火堆

Output

走不出去输出IMPOSSIBLE,否者输出最少时间

Sample Input

2
4 4
####
#JF#
#..#
#..#
3 3
###
#J.
#.F

Sample Output

3
IMPOSSIBLE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值