FZU2150

来源:互联网 发布:淘宝营销词 编辑:程序博客网 时间:2024/06/05 03:48

题目名称:Fire Game

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2150


题意:给出一个m*n的图,‘#’表示草坪,‘ . ’表示空地,然后可以选择在任意的两个草坪格子点火,火每秒会向周围四个格子扩散,问选择那两个点使得燃烧所有的草坪花费时间最小?


思路:因为题目数据不大,所以可以从中随便找两个点bfs


代码如下:

#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<cmath>#include<vector>#include<queue>using namespace std;const int INF=0x3f3f3f3f;char a[15][15];int vis[15][15];int dir[4][2]={0,1,0,-1,1,0,-1,0};struct Node{    int x,y;    int cnt;    Node(int x,int y,int cnt)    {        this->x=x;        this->y=y;        this->cnt=cnt;    }    Node(){}};vector<struct Node> v;queue<Node> q;int t,n,m;int bfs(Node k,Node b){    memset(vis,0,sizeof(vis));    vis[k.x][k.y]=vis[b.x][b.y]=1;    k.cnt=0;b.cnt=0;    while(!q.empty())        q.pop();    q.push(k);q.push(b);    int sum=INF;    while(!q.empty())    {        Node now=q.front();        q.pop();        sum=now.cnt;        for(int i=0;i<4;i++)        {            Node tmp;            tmp.x=now.x+dir[i][0];            tmp.y=now.y+dir[i][1];            tmp.cnt=now.cnt+1;            if(tmp.x>=0&&tmp.y>=0&&tmp.x<n&&tmp.y<m&&!vis[tmp.x][tmp.y]&&a[tmp.x][tmp.y]=='#')            {                vis[tmp.x][tmp.y]=1;                    q.push(tmp);            }        }    }    return sum;}int main(){    while(scanf("%d",&t)!=EOF)    {        for(int ss=1;ss<=t;ss++)        {            scanf("%d%d%*c",&n,&m);            v.clear();            for(int i=0;i<n;i++)            {                for(int j=0;j<m;j++)                {                    scanf("%c",&a[i][j]);                    if(a[i][j]=='#')                        v.push_back(Node(i,j,0));                }                getchar();            }            int ans=INF;            for(int i=0;i<v.size();i++)            {                for(int j=i;j<v.size();j++)                {                    int tmp=bfs(v[i],v[j]);                    bool ok=true;                    for(int k=0;k<n;k++)                    {                        for(int f=0;f<m;f++)                        {                            if(vis[k][f]==0&&a[k][f]=='#')                            {                                ok=false;                                break;                            }                        }                        if(ok==false)                            break;                    }                    if(ok)                    {                        ans = min(ans,tmp);                    }                }            }            printf("Case %d: ",ss);            if(ans==INF)                printf("-1\n");            else                printf("%d\n",ans);        }    }    return 0;}



0 0
原创粉丝点击