zoukankan      html  css  js  c++  java
  • Fire! UVA 11624

    http://acm.hust.edu.cn/vjudge/contest/121377#problem/J

    题意: 有一个人 'J' 身处迷宫, 迷宫四周有墙 '#', 还有火的源点 'F',当然,火会向上下左右四个方向蔓延, 问你 'J' 能否逃出这个迷宫。

     

    注意:  火的源点可能不止有一个, 也有可能一个也没有。

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<queue>
    using namespace std;
    typedef long long LL;
    #define oo 0x3f3f3f3f
    #define maxn 1500
    int dir[4][2]={{0, 1},{1, 0},{0, -1},{-1, 0}};
    char maps[maxn][maxn];
    int  v1[maxn][maxn], v2[maxn][maxn];
    int n, m, nfir;
    
    struct node
    {
        int x, y;
    };
    
    node fir[maxn*maxn];
    void BFSFIR()
    {
        queue<node>Q;
    
        for(int i=0; i<nfir; i++)
        {
            Q.push(fir[i]);
            v1[fir[i].x][fir[i].y]=1;
        }
    
        while(Q.size())
        {
            node now, next;
            now = Q.front();
            Q.pop();
    
            for(int i=0; i<4; i++)
            {
                next.x =now.x+dir[i][0];
                next.y = now.y+dir[i][1];
                if(next.x>=0 && next.x<n && next.y>=0 && next.y<m && v1[next.x][next.y]==oo && maps[next.x][next.y]!='#')
                {
                    v1[next.x][next.y] = v1[now.x][now.y]+1;
                    Q.push(next);
                }
            }
        }
    }
    
    int BFS(node p)
    {
        queue<node>Q;
        Q.push(p);
        node now, next;
        v2[p.x][p.y] = 1;
    
        while(Q.size())
        {
            now = Q.front();
            Q.pop();
    
            if((now.x==0 || now.x==n-1 || now.y==0 || now.y==m-1) && v2[now.x][now.y] < v1[now.x][now.y])
                 return v2[now.x][now.y];
    
            for(int i=0; i<4; i++)
            {
                next.x =now.x+dir[i][0];
                next.y = now.y+dir[i][1];
                if(next.x>=0 && next.x<n && next.y>=0 && next.y<m
                && !v2[next.x][next.y] && maps[next.x][next.y]!='#')
                {
                   v2[next.x][next.y] = v2[now.x][now.y]+1;
                    Q.push(next);
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        int T;
        node  s;
    
        scanf("%d",&T);
    
        while(T--)
        {
            nfir = 0;
    
            scanf("%d %d", &n, &m);
    
            for(int i=0; i<n; i++)
            {
                scanf("%s",maps[i]);
                for(int j=0; j<m; j++)
                {
                    v1[i][j] = oo;
                    if(maps[i][j] == 'J')
                        s.x=i,s.y=j;
                    if(maps[i][j] == 'F')
                    {
                        fir[nfir].x=i,fir[nfir].y=j;
                        nfir++;
                    }
                }
            }
    
    
           BFSFIR();
    
           memset(v2, 0, sizeof(v2));
    
           int ans = BFS(s);
    
            if(ans == -1)  printf("IMPOSSIBLE
    ");
            else printf("%d
    ", ans);
    
        }
        return 0;
    }
    View Code
  • 相关阅读:
    PHP 开发 APP 接口 学习笔记与总结
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 43 字符串相乘
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 42 接雨水
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
    Java实现 LeetCode 41 缺失的第一个正数
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5687078.html
Copyright © 2011-2022 走看看