FZU 2150 Fire Game

来源:互联网 发布:js 什么时候使用链表 编辑:程序博客网 时间:2024/06/05 12:38

题意:输入n行m列的图,‘#’表示草坪,任选两个草坪点火,火只能在草坪上蔓延,求烧光所有草坪的最短时间

解题思路:两点bfs.要注意的是可能只有一块草坪,但暴力的话这种情况也包括在内。因为数据较小,直接枚举就可以了,任选两块草坪,bfs找出当前情况下烧光所有草坪的时间,不断更新最小时间即可.还有一点就是判断时要用d[nx][ny]>d[p.x][p.y]+1,不能直接判断等不等于INF,因为两点同时bfs可能会烧到同一片草坪,而这片草坪被烧的时间应该是较早的那一个

代码:

#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <cmath>#include <cstdio>#include <queue>using namespace std;#define INF 0x3f3f3f3fint dr[]= {-1,0,1,0};int dc[]= {0,1,0,-1};int m,n;char g[15][15];int d[15][15];struct P{    int x,y;    P(int a=0,int b=0):x(a),y(b) {}};bool inside(int x,int y){    return x>=0&&x<n&&y>=0&&y<m;}int bfs(int x,int y,int xx,int yy){    for(int i=0; i<n; i++)    {        for(int j=0; j<m; j++)        {            d[i][j]=INF;        }    }    queue<P> q;    q.push(P(x,y));    q.push(P(xx,yy));    d[x][y]=0;    d[xx][yy]=0;    while(!q.empty())    {        P p=q.front();        q.pop();        for(int i=0; i<4; i++)        {            int nx=p.x+dr[i],ny=p.y+dc[i];            if(inside(nx,ny)&&d[nx][ny]>d[p.x][p.y]+1&&g[nx][ny]=='#')            {                q.push(P(nx,ny));                d[nx][ny]=d[p.x][p.y]+1;            }        }    }    int maxt=-1;    for(int i=0; i<n; i++)//可能有的草坪烧不到    {        for(int j=0; j<m; j++)        {            if(g[i][j]=='#')maxt=max(maxt,d[i][j]);        }    }    return maxt;}int main(){    int tt;    cin>>tt;    int cas=0;    while(tt--)    {        cin>>n>>m;        for(int i=0; i<n; i++)        {            for(int j=0; j<m; j++)            {                cin>>g[i][j];            }        }        int t,mint=INF;        for(int i=0; i<n; i++)        {            for(int j=0; j<m; j++)            {                if(g[i][j]=='#')                {                    for(int k=0; k<n; k++)                    {                        for(int l=0; l<m; l++)                        {                            if(g[k][l]=='#')                            {                                t=bfs(i,j,k,l);                                mint=min(t,mint);                            }                        }                    }                }            }        }        cout<<"Case "<<++cas<<": ";        if(mint==INF)cout<<-1<<endl;        else cout<<mint<<endl;    }    return 0;}