UVA 11624 Fire

(UVA 11624 Fire!)

题意

https://vjudge.net/problem/UVA-11624#author=zmyhh

题解

通过 BFS 进行搜索,先搜索火到达 (x,y) 这个位置需要的最少时间,之后对 J 进行搜索,需要增加一些约束条件,可以走一些火还没有到达的位置或者火根本就不能到达的位置。

之后处理一下结果。

代码

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 1e3+5;
int step[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
char s[maxn][maxn];
int vis[maxn][maxn];
int dis[maxn][maxn];
int n,m;
struct node{
    int x,y,val;
};
node exnode(int x,int y,int val){
    node vv;
    vv.x=x;vv.y=y;vv.val=val;
    return vv;
}
int slove(){
    memset(vis,0,sizeof(vis));
    memset(dis,0,sizeof(dis));
    queue<node>q;
    for(int i=0;i<n;++i){
        for(int j=0;j<m;++j){
            if(s[i][j]=='F'){
                q.push(exnode(i,j,1));
                vis[i][j]=1;
            }
        }
    }
    while(!q.empty()){
        node p=q.front();
        q.pop();
        for(int i=0;i<4;++i){
            int xx=p.x+step[i][0];
            int yy=p.y+step[i][1];
            if(xx>=0&&xx<n&&yy>=0&&yy<m&&s[xx][yy]!='#'&&!vis[xx][yy]){
                vis[xx][yy]=p.val+1;
                q.push(exnode(xx,yy,p.val+1));
            }
        }
    }
    for(int i=0;i<n;++i){
        for(int j=0;j<m;++j){
            if(s[i][j]=='J'){
                q.push(exnode(i,j,1));
                dis[i][j]=1;
            }
        }
    }
    while(!q.empty()){
        node p=q.front();
//        printf("%d %d %d
",p.x,p.y,p.val);
        if(p.x==0||p.x==n-1||p.y==0||p.y==m-1){
            return p.val;
        }
        q.pop();
        for(int i=0;i<4;++i){
            int xx=p.x+step[i][0];
            int yy=p.y+step[i][1];
//            printf("%d %d %d
",xx,yy,vis[xx][yy]);
            if(xx>=0&&yy>=0&&xx<n&&yy<m&&s[xx][yy]!='#'&&!dis[xx][yy]&&(vis[xx][yy]>p.val+1||!vis[xx][yy])){
                q.push(exnode(xx,yy,p.val+1));
                dis[xx][yy]=p.val+1;
            }
        }
    }
    return -1;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;++i)
            scanf("%s",s[i]);
        int res=slove();
        if(res==-1)printf("IMPOSSIBLE
");
        else printf("%d
",res);
    }
    return 0;
}

新赛季的开始
原文地址:https://www.cnblogs.com/VagrantAC/p/12771733.html