Problem 2150 Fire Game(bfs)

Problem 2150 Fire Game

题意:一块n*m的有草有空地的矩阵方格,然后选择两个有草的地方开始烧火,与当前草皮有链接边的可在下一秒被烧着,空地不能被烧,我有两次机会,选择一个地方开始烧。问最少要几秒可以得到一个完全空地,草都被烧光了,若不能烧光输出-1。
思路:因为给定的是一个矩阵形式的,我们把它有草的地方再次存储,然后找一对一对的进行bfs,找到最小值。
代码
还是从一个点出发有四个方向,只不过一开始的起始点有两个同时压入栈中,两个点开始bfs后的结果,来判断是否是我想要得到的结果,是则更新。

#include
#include
#include
#include
#include
#include
using namespace std;
const int oo = 0xfffffff;
const int maxn=1005;
struct E
{
    int x,y,step;
} s[505],p,cur;
int n,m,cnt=0,ans;
int vis[20][20];
char maps[20][20];
int dir[4][2] = {{0, 1},{1, 0},{0, -1}, {-1, 0}};
int check()
{
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            if(maps[i][j]=='#'&&!vis[i][j])
            {
                return 0;
            }
        }
    }
    return 1;
}
int bfs(E a,E b)
{
    queue<E>q;
    q.push(a);
    q.push(b);
    vis[a.x][a.y]=1;
    vis[b.x][b.y]=1;
    while(!q.empty())
    {
        p=q.front();
        q.pop();
        for(int i=0; i<4; i++)
        {
            cur.x=p.x+dir[i][0];
            cur.y=p.y+dir[i][1];
            if(cur.x>=0&&cur.x<n&&cur.y>=0&&cur.y<m&&maps[cur.x][cur.y]=='#'&&!vis[cur.x][cur.y])
            {
                vis[cur.x][cur.y]=1;
                cur.step=p.step+1;
                q.push(cur);
            }
        }
    }
    return p.step;
}
int main()
{
    int t,k=0;
    scanf("%d",&t);
    while(t--)
    {
        k++;
        ans=oo;
        scanf("%d%d",&n,&m);
        memset(vis,0,sizeof(vis));
        cnt=0;
        for(int i=0; i<n; i++)
        {
            scanf("%s",&maps[i]);
            for(int j=0; j<m; j++)
            {
                if(maps[i][j]=='#')
                {
                    s[cnt].x=i;
                    s[cnt].y=j;
                    s[cnt].step=0;
                    cnt++;
                }
            }
        }
        for(int i=0; i<cnt; i++)
        {
            for(int j=i; j<cnt; j++)
            {
                memset(vis,0,sizeof(vis));
                int tmp=bfs(s[i],s[j]);
                if(tmp<ans&&check())
                    ans=tmp;
            }
        }
        if(ans==oo)
            printf("Case %d: -1\n",k);
        else
            printf("Case %d: %d\n",k,ans);
    }
    return 0;
}

你可能感兴趣的:(bfs)