zoukankan      html  css  js  c++  java
  • foj 2150 bfs

    题意:

    给定一个平面图 . 为空地(不着火) # 为草

    开始可以选1-2个草堆点燃,每隔一秒会把上下左右的草引燃(开始时间为0秒)

    问把所有草烧光的最少时间

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    
    const int INF=1000000000;
    inline int min(int a,int b){return a<b?a:b;}
    inline int max(int a,int b){return a>b?a:b;}
    
    char mp[15][15];
    int v[15][15];
    int R,C;
    int dir[4][2]={0,1,0,-1,1,0,-1,0};
    
    struct Node{
        int x,y;
        Node(int x=0,int y=0):x(x),y(y){}
    }t1,t2;
    
    int bfs(int a,int b,int c,int d)
    {
        int i,j,ans=0;
        for(i=0;i<15;i++) for(j=0;j<15;j++) v[i][j]=INF;
        queue<Node> Q;
        Q.push(Node(a,b));
        Q.push(Node(c,d));
        v[a][b]=v[c][d]=0;
        while(!Q.empty())
        {
            t1=Q.front();Q.pop();
            for(i=0;i<4;i++)
            {
                t2.x=t1.x+dir[i][0];t2.y=t1.y+dir[i][1];
                if(mp[t2.x][t2.y]=='#' && v[t2.x][t2.y]>v[t1.x][t1.y]+1)
                {
                    Q.push(t2);v[t2.x][t2.y]=v[t1.x][t1.y]+1;
                }
            }
        }
        for(i=1;i<=R;i++)
        {
            for(j=1;j<=C;j++)
            if(mp[i][j]=='#') ans=max(ans,v[i][j]);
        }
        return ans;
    }
    
    int Slove()
    {
        int Min=INF;
        int i,j,k,m;
        for(i=1;i<=R;i++)
        {
            for(j=1;j<=C;j++)
            {
                if(mp[i][j]=='#')
                {
                    for(k=i;k<=R;k++)
                    {
                        for(m=1;m<=C;m++)
                        if(mp[k][m]=='#')
                        {
                            if(i==k && j==m) continue;
                            Min=min(Min,bfs(i,j,k,m));
                        }
                    }
                }
            }
        }
        return Min==INF?-1:Min;
    }
    int main()
    {
        int cnt,t,Icase,i,j;
        scanf("%d",&t);
        for(Icase=1;Icase<=t;Icase++)
        {
            cnt=0;
            scanf("%d %d",&R,&C);
            for(i=1;i<=R;i++)
            {
                getchar();
                for(j=1;j<=C;j++)
                {
                    scanf("%c",&mp[i][j]);
                    if(mp[i][j]=='#') cnt++;
                }
            }
            if(cnt<=2) {printf("Case %d: 0
    ",Icase);continue;}
            for(i=0;i<=R;i++) mp[i][0]=mp[i][C+1]='.';
            for(i=0;i<=C;i++) mp[0][i]=mp[R+1][i]='.';
            printf("Case %d: %d
    ",Icase,Slove());
        }
        return 0;
    }
  • 相关阅读:
    阻止默认事件和冒泡
    js获取元素相对窗口位置
    ios中safari浏览器中date问题
    模拟单选框,多选框
    vue
    js合并两个对象的方法
    oracle 序列
    Oracle生成随机数大全
    JAVA基础面试题
    网速计算
  • 原文地址:https://www.cnblogs.com/xiong-/p/3601156.html
Copyright © 2011-2022 走看看