FZU 2150 Fire Game --两点同步搜索

枚举两点,然后同步BFS,看代码吧,很容易懂的。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#define Mod 1000000007
using namespace std;

struct Point
{
    int x,y;
    int step;
}S;
char mp[13][13];
int vis[13][13];
int n,m;
int lef;
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
queue<Point> que;

bool OK(int nx,int ny)
{
    if(nx < n && nx >= 0 && ny < m && ny >= 0)
        return true;
    return false;
}

int BFS()
{
    int maxi = 0;
    while(!que.empty())  //同步搜索
    {
        int SIZE = que.size();
        while(SIZE--)
        {
            Point tmp = que.front();
            que.pop();
            int nx = tmp.x;
            int ny = tmp.y;
            int step = tmp.step;
            maxi = max(maxi,step);
            Point now;
            for(int k=0;k<4;k++)
            {
                int kx = nx + dx[k];
                int ky = ny + dy[k];
                if(!OK(kx,ky) || vis[kx][ky])
                    continue;
                if(mp[kx][ky] == ‘#‘)
                {
                    vis[kx][ky] = 1;
                    now.x = kx;
                    now.y = ky;
                    now.step = step+1;
                    que.push(now);
                    lef--;
                }
            }
        }
    }
    if(lef == 0)
        return maxi;
    else
        return -1;
}

int main()
{
    int t,cs = 1,i,j,k,h;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        int cnt = 0;
        for(i=0;i<n;i++)
        {
            scanf("%s",mp[i]);
            for(j=0;j<m;j++)
                if(mp[i][j] == ‘#‘)
                    cnt++;
        }
        int flag = 0;
        int tag = Mod;
        for(i=0;i<n;i++)   //第一个点
        {
            for(j=0;j<m;j++)
            {
                if(mp[i][j] == ‘#‘)
                {
                    for(k=i;k<n;k++)   //第二个点
                    {
                        for(h=(k==i?j:0);h<m;h++)
                        {
                            if(mp[k][h] == ‘#‘)
                            {
                                memset(vis,0,sizeof(vis));
                                S.x = i,S.y = j,S.step = 0;
                                que.push(S);
                                lef = cnt-1;
                                vis[i][j] = 1;
                                if(!(i==k&&j==h))
                                {
                                    S.x = k,S.y = h,S.step = 0;
                                    que.push(S);
                                    vis[k][h] = 1;
                                    lef--;
                                }
                                int res = BFS();
                                if(res != -1)
                                {
                                    flag = 1;
                                    tag = min(tag,res);
                                }
                            }
                        }
                    }
                }
            }
        }
        if(flag)
            printf("Case %d: %d\n",cs++,tag);
        else
            printf("Case %d: -1\n",cs++);
    }
    return 0;
}

FZU 2150 Fire Game --两点同步搜索,布布扣,bubuko.com

时间: 2024-12-23 16:54:49

FZU 2150 Fire Game --两点同步搜索的相关文章

FZU 2150 Fire Game(点火游戏)

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-size: 10.5000pt } h2 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 18.0000pt } h3 {

FZU 2150 Fire Game (暴力BFS)

[题目链接]click here~~ [题目大意]: 两个熊孩子要把一个正方形上的草都给烧掉,他俩同时放火烧,烧第一块的时候是不花时间的,每一块着火的都可以在下一秒烧向上下左右四块#代表草地,.代表着不能烧的.问你最少花多少时间可以烧掉,如果烧不掉就输出-1 [解题思路]: 数据比较弱的情况下直接暴力枚举每块草坪上可以放的位置,比较高端的写法目前没有想到,以后想到了文章更新下~~ ps:由于一个细节没注意,导致WA了几乎一页,还以为FZU 判题出错了,后来突然发现每次从队列里拿出队首的元素,才是

FZU 2150 Fire Game(DFS+BFS)

题意  在n*m个格子组成的草地上   你可以选择两个是草('#')的格子点燃  每个点燃的格子在下一秒其四个相邻的是草的格子也会被点燃   问点燃所有的草至少需要多少秒 DFS和BFS的综合  如果'#'连通块的数量大于2个是肯定不能点燃所有的  先dfs判断连通块个数  再bfs找出选哪两个格子可以最快把草烧完 #include <map> #include <cstdio> #include <cstring> using namespace std; const

FZU - 2150 Fire Game(两点bfs)

题目大意: 给你一个n*m的图,里面有草也有空地(#代表草).现在有两个人各在一块草地点火要烧掉这些草,并且燃烧的草可以向上下左右四个方向蔓延,问最少多长时间可以将所有的草都烧完,不能全部烧完输出-1. 两个起点的BFS,感觉和求最短路差不多,依次枚举两个起点,找到步数最多的那个草地,再从每次枚举的结果中找最小的. #include<iostream> #include<cstdio> #include<cmath> #include<algorithm>

(FZU 2150) Fire Game (bfs)

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2150 Problem Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns). At the beginning, each grid of this board is consisting of grass or just empty a

FZU 2150 Fire Game(BFS)

Problem Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns). At the beginning, each grid of this board is consisting of grass or just empty and then they start to fire all the grass. Firstl

fzu 2150 Fire Game 【技巧BFS】

题目:fzu2150 Fire Game 题意:给出一个m*n的图,'#'表示草坪,' . '表示空地,然后可以选择在任意的两个草坪格子点火,火每 1 s会向周围四个格子扩散,问选择那两个点使得燃烧所有的草坪花费时间最小? 分析:这个题目如果考虑技巧的话有点难度,但是鉴于数据范围比较小,我们可以暴力枚举任意的草坪所在的点,然后两个点压进队列里面BFS,去一个满足条件的最小值即可. 顺便说一下 fzu 2141 Sub-Bipartite Graph 的思路,比赛的时候没有做出来. 这个题目想的复

(简单) FZU 2150 Fire Game ,Floyd。

Problem Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns). At the beginning, each grid of this board is consisting of grass or just empty and then they start to fire all the grass. Firstl

FZU 2150 Fire Game

题意:在n*m的图中'#'表示草坪' . '表示空地,可以选择在任意的两个草坪格子点火,火每 1 s会向周围四个格子扩散,问选择那两个点使得燃烧完所有的草坪花费时间最小. 分析:广度搜索,点火的格子可以为同一个.双循环遍历可以点火的草地,搜索得到每次烧完所用的步数,记录最小的一个.搜索是为了记录烧过的草地,和每次最外层草地烧完花费的时间. 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring>