FZU 2150 Fire Game(kuangbin带你飞 专题一:简单搜索)

回到家了- -下午在网吧写了三道,晚上回来没找到合适的桌子敲代码- -就躺被窝里面敲代码了...貌似不是很顺手...这个题目以前见到看不懂意思...没做

题意:给定一张n*m的图,#是草地,‘.’是空地,在两个地方各自放一把火,问烧完所有的草地最短时间是多少...

图的范围是10*10..看起来范围不大..然后就是枚举所有的草地,任意取两个...最差9900种情况...在跑BFS...不太会计算- -抱着试试的态度就做了...然后500+MS..

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
char map[20][20];
int used[20][20],n,m;
int d[4][2]={1,0,-1,0,0,1,0,-1};
int ok(int x,int y)
{
    if(x<0||y<0||x>=n||y>=m)
        return 0;
    if(map[x][y]!='#'||used[x][y]==1)
        return 0;
    return 1;
}
struct node
{
    int x,y,t;
};
int bfs(int ax,int ay,int bx,int by)
{
    queue<node> q;
    node now,next;
    memset(used,0,sizeof(used));
    now.x=ax,now.y=ay,now.t=0;
    next.x=bx,next.y=by,next.t=0;
    used[ax][ay]=used[bx][by]=1;
    q.push(now);
    q.push(next);
    int ans=0x7fffffff;
    while(!q.empty())
    {
        now=q.front();
        q.pop();
        ans=now.t;
        for(int i=0;i<4;i++)
        {
            next.x=now.x+d[i][0];
            next.y=now.y+d[i][1];
            next.t=now.t+1;
            if(ok(next.x,next.y))
            {
                used[next.x][next.y]=1;
                q.push(next);
            }
        }
    }
    return ans;
}
int main()
{
    int T;
    cin>>T;
    node s[200];
    for(int cas=1;cas<=T;cas++)
    {
        int k=0;
        memset(map,0,sizeof(map));
        cin>>n>>m;
        for(int i=0;i<n;i++)
            scanf("%s",map[i]);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(map[i][j]=='#')
                    {s[k].x=i;s[k].y=j;k++;}
            }
        }
        int mini=0x7fffffff;
        for(int i=0;i<k;i++)
        {
            for(int j=i;j<k;j++)
            {
                int ans=bfs(s[i].x,s[i].y,s[j].x,s[j].y);
                int flag=1;
                for(int x=0;x<n;x++)
                {
                    for(int y=0;y<m;y++)
                    {
                        if(used[x][y]==0&&map[x][y]=='#')
                        {
                            flag=0;
                            break;
                        }

                    }
                    if(flag==0)
                        break;
                }
                if(flag)
                {
                    mini=min(ans,mini);
                }
            }
        }
        printf("Case %d: ",cas);
        if(mini==0x7fffffff)
            printf("-1\n");
        else
            printf("%d\n",mini);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值