zoukankan      html  css  js  c++  java
  • 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;
    }
    
    
    新赛季的开始
  • 相关阅读:
    CodeForces
    POJ1113 Wall —— 凸包
    UVA11330 Andy's Shoes —— 置换分解
    FZU2013 A short problem —— 线段树/树状数组 + 前缀和
    fzu月赛 2203 单纵大法好 二分
    codeforces 519E A and B and Lecture Rooms LCA倍增
    hdu 5459 Jesus Is Here (费波纳茨递推)
    zoj 3469 Food Delivery 区间dp + 提前计算费用
    hdu5438 Ponds dfs 2015changchun网络赛
    hdu5432 二分
  • 原文地址:https://www.cnblogs.com/VagrantAC/p/12771733.html
Copyright © 2011-2022 走看看