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

来源:互联网 发布:2017年网络红歌 编辑:程序博客网 时间:2024/06/05 23:50

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

题意:给定一张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;}


0 0
原创粉丝点击