UVA 11624 Fire! (BFS)

题意:一个迷宫起火了,判断joe能否从迷宫中跑出来

分析:用两次bfs,一次求火蔓延到点的时间,一次joe逃跑

坑点:好几个地方起火,WA到怀疑人生!!!!!

#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 10000000007
#define mem(a) memset(a,0,sizeof(a))

using namespace std;

typedef pair <int,int> pii;
const int maxn = 1000+5 , inf = 0x3f3f3f3f;

char G[maxn][maxn];
int vis[maxn][maxn];
int t[maxn][maxn];
int n,m;
const int dx[]={1,-1,0,0};
const int dy[]={0,0,-1,1};
struct Node{
    int x,y,d;
    Node(int xx,int yy,int dd):x(xx),y(yy),d(dd){};
};
vector<Node>fires;

bool can(int x,int y){
    if(1<=x&&x<=n&&1<=y&&y<=m&&G[x][y]!='#') return true;
    return false;
}

void bfs1(){
    queue<Node>q;
    for(int i=0;i<fires.size();i++){
        int x = fires[i].x;
        int y = fires[i].y;
        q.push(Node(x,y,1));
        vis[x][y] = 1;
    }
    while(!q.empty()){
        Node now = q.front();q.pop();
        for(int i=0;i<4;i++){
            int nx = now.x+dx[i];
            int ny = now.y+dy[i];
            if(can(nx,ny)&&!vis[nx][ny]){
                t[nx][ny] = now.d;
                q.push(Node(nx,ny,now.d+1));
                vis[nx][ny]=1;
            }
        }
    }
}

bool judge(Node now){
    if(now.x==n||now.x==1||now.y==1||now.y==m) return true;
    return false;
}

int bfs(int jx,int jy){
    vis[jx][jy]=1;
    Node tmp(jx,jy,0);
    queue<Node>q;
    q.push(tmp);
    while(!q.empty()){
        Node now = q.front();q.pop();
        if(judge(now)){
            return now.d+1;
        }
        for(int i=0;i<4;i++){
            int nx = now.x+dx[i];
            int ny = now.y+dy[i];
            if(!vis[nx][ny]&&now.d+1<t[nx][ny]&&G[nx][ny]!='#'){
                q.push(Node(nx,ny,now.d+1));
                vis[nx][ny]=1;
            }
        }
    }
    return -1;
}

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int T;
    scanf("%d",&T);
    while(T--){
        fires.clear();
        int jx,jy;
        memset(t,inf,sizeof(t));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf(" %c",&G[i][j]);
                if(G[i][j]=='J'){
                    jx = i;
                    jy = j;
                }
                if(G[i][j]=='F'){
                    t[i][j]=0;
                    fires.push_back(Node(i,j,1));
                }
            }
        }
        mem(vis);
        bfs1();
        mem(vis);
        int ans = bfs(jx,jy);
        if(ans!=-1) cout<<ans<<endl;
        else cout<<"IMPOSSIBLE"<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/Insist_77/article/details/81459535
今日推荐