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;
}
原文地址:https://www.cnblogs.com/xiong-/p/3601156.html