NEFU 1214 逃出迷宫 (BFS寻径)

版权声明:欢迎转载,请注明出处噢,谢谢 https://blog.csdn.net/DT2131/article/details/53761697

题意:

中文

思路:
两种思路:
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

展开阅读全文

没有更多推荐了,返回首页