• 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;
    }
    
    
    新赛季的开始
  • 相关阅读:
    一个基础的C#的ACCESS操作类
    ASP.NET常用的三十三种实用代码
    在ASP.NET中使用MD5和SHA1加密
    一个比较漂亮的DataGrid样式表
    微软的面试题
    打印自定义纸张大小
    ASP.Net(C#)连接Oracle数据库的方法
    C#正则表达式应用范例
    matlab 字符串处理函数
    centos语言设置
  • 原文地址:https://www.cnblogs.com/VagrantAC/p/12771733.html
Copyright © 2020-2023  润新知