• UVA 11624 Fire! bfs 难度:0


    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2671

    首先对火进行一次bfs,得到着火时间,然后对人进行一次bfs,只允许进入还没有着火的点

    注意:出迷宫条件是从任何一墙出去,过墙需要1时间

    #include <cstdio>
    #include <cstring>
    #include <queue>
    using namespace std;
    const int maxn=1003;
    const int inf=0x3fffffff;
    char maz[maxn][maxn];
    int time[maxn][maxn];
    int dp[maxn][maxn];
    int n,m;
    
    queue<int> que;
    const int dx[8]={0,0,1,-1,1,1,-1,-1};
    const int dy[8]={1,-1,0,0,1,-1,1,-1};
    struct pnt {
            int x,y;
            pnt(){x=y=0;}
            pnt(int tx,int ty){x=tx,y=ty;}
    };
    bool in(int x,int y){
            return x>=0&&x<n&&y>=0&&y<m;
    }
    void bfs(){
            while(!que.empty()){
                    int x=que.front()/maxn,y=que.front()%maxn;que.pop();
                    for(int i=0;i<4;i++){
                            int tx=x+dx[i],ty=y+dy[i];
                            if(in(tx,ty)&&maz[tx][ty]!='#'&&time[tx][ty]>time[x][y]+1){
                                    time[tx][ty]=time[x][y]+1;
                                    que.push(tx*maxn+ty);
                            }
                    }
            }
    }
    int bfs2(int sx,int sy){
            while(!que.empty())que.pop();
            dp[sx][sy]=0;
            que.push(sx*maxn+sy);
            while(!que.empty()){
                    int x=que.front()/maxn,y=que.front()%maxn;que.pop();
                    for(int i=0;i<4;i++){
                            int tx=x+dx[i],ty=y+dy[i];
                            if(!in(tx,ty)){
                                    return dp[x][y]+1;
                            }
                            if(maz[tx][ty]!='#'&&time[tx][ty]>dp[x][y]+1&&dp[tx][ty]>dp[x][y]+1){
                                    dp[tx][ty]=dp[x][y]+1;
                                    que.push(tx*maxn+ty);
                            }
                    }
            }
            return -1;
    }
    void init(){
            while(!que.empty())que.pop();
            for(int i=0;i<n;i++){
                    for(int j=0;j<m;j++){
                            time[i][j]=inf;
                            dp[i][j]=inf;
                    }
            }
    
    }
    int main(){
            int T;
            scanf("%d",&T);
            for(int ti=1;scanf("%d%d",&n,&m)==2&&ti<=T;ti++){
                    for(int i=0;i<n;i++){
                            scanf("%s",maz[i]);
                    }
                    init();
                    int sx,sy;
                    for(int i=0;i<n;i++){
                            for(int j=0;j<m;j++){
                                    if(maz[i][j]=='F'){
                                            que.push(i*maxn+j);
                                            time[i][j]=0;
                                    }
                                    else if(maz[i][j]=='J'){
                                            sx=i;
                                            sy=j;
                                    }
                            }
                    }
                    bfs();
                    int ans=bfs2(sx,sy);
    
                    if(ans!=-1)printf("%d
    ",ans);
                    else puts("IMPOSSIBLE");
            }
            return 0;
    }
    

      

  • 相关阅读:
    jenkins初始化启动报错导致进入web页面无法安装插件
    redis5.0.7集群搭建
    搭建redis哨兵模式
    Linux服务器安装python3.6
    MySQL绿色版安装
    OSChina中远程GIT仓库同步探索
    Android坡度计
    利用ADB获取APP资源
    实现两台路由器无线桥接
    新体能评定软件开发总结(一)
  • 原文地址:https://www.cnblogs.com/xuesu/p/4338175.html
Copyright © 2020-2023  润新知