• UVA11624_Fire!


    在一个矩形方阵里面,一个人要从一个位置走向另一个位置,其中某些地方有火源,每过一分钟,火源就会点燃相邻的点,同时相邻的点也变成了火源。人不能通过有火的点。问一个人能够安全地走到目的地去?最短时间多少?

    氺题不多说,直接预处理每个点的起火时间,然后bfs即可。

     

     

    召唤代码君:

     

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    #define maxn 1010
    using namespace std;
    
    char s[maxn][maxn];
    int g[maxn][maxn];
    int T,n,m;
    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};
    
    bool inside(int cx,int cy)
    {
        return cx>0 && cx<=n && cy>0 && cy<=m;
    }
    
    bool border(int cx,int cy)
    {
        return cx==1 || cx==n || cy==1 || cy==m;
    }
    
    void init_fire()
    {
        for (int i=1; i<=n; i++)
            for (int j=1; j<=m; j++) g[i][j]=99999999;
        queue<int> qx,qy;
        for (int i=1; i<=n; i++)
            for (int j=1; j<=m; j++)
                if (s[i][j]=='F') qx.push(i),qy.push(j),g[i][j]=0;
        while (!qx.empty())
        {
            int cx=qx.front(),cy=qy.front();
            qx.pop(),qy.pop();
            for (int i=0; i<4; i++)
            {
                if (!inside(cx+dx[i],cy+dy[i])) continue;
                if (s[cx+dx[i]][cy+dy[i]]!='.') continue;
                if (g[cx][cy]+1>=g[cx+dx[i]][cy+dy[i]]) continue;
                g[cx+dx[i]][cy+dy[i]]=g[cx][cy]+1;
                qx.push(cx+dx[i]),qy.push(cy+dy[i]);
            }
        }
    }
    
    int bfs()
    {
        queue<int> qx,qy;
        for (int i=1; i<=n; i++)
            for (int j=1; j<=m; j++)
                if (s[i][j]=='J')
                {
                    g[i][j]=0;
                    qx.push(i),qy.push(j);
                    if (border(i,j)) return 1;
                }
        while (!qx.empty())
        {
            int cx=qx.front(),cy=qy.front();
            qx.pop(),qy.pop();
            for (int i=0; i<4; i++)
            {
                if (s[cx+dx[i]][cy+dy[i]]!='.') continue;
                if (g[cx][cy]+1>=g[cx+dx[i]][cy+dy[i]]) continue;
                if (border(cx+dx[i],cy+dy[i])) return g[cx][cy]+2;
                g[cx+dx[i]][cy+dy[i]]=g[cx][cy]+1;
                qx.push(cx+dx[i]),qy.push(cy+dy[i]);
            }
        }
        return -1;
    }
    
    int main()
    {
        scanf("%d",&T);
        while (T--)
        {
            scanf("%d%d",&n,&m);
            for (int i=1; i<=n; i++) scanf("%s",s[i]+1);
            init_fire();
            int ans=bfs();
            if (ans==-1) puts("IMPOSSIBLE");
                else printf("%d
    ",ans);
    
        }
        return 0;
    }
    

      

    如有转载,请注明出处(http://www.cnblogs.com/lochan)
  • 相关阅读:
    CSP-S全国模拟赛第三场 【nan死了】
    ●SCOI2018 AFO
    ●洛谷P2934 [USACO09JAN]安全出行Safe Travel
    ●洛谷P3233 [HNOI2014]世界树
    ●洛谷P2495 [SDOI2011]消耗战
    ●UOJ58 [WC2013]糖果公园
    ●洛谷P1903 [国家集训队]数颜色
    ●BZOJ 4237 稻草人
    ●Joyoi Normal
    ●CodeForces 698C LRU
  • 原文地址:https://www.cnblogs.com/lochan/p/3842425.html
Copyright © 2020-2023  润新知