FZU 2150 Fire Game 【两点BFS】
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. Firstly they choose two grids which are consisting of grass and set fire. As we all know, the fire can spread among the grass. If the grid (x, y) is firing at time t, the grid which is adjacent to this grid will fire at time t+1 which refers to the grid (x+1, y), (x-1, y), (x, y+1), (x, y-1). This process ends when no new grid get fire. If then all the grid which are consisting of grass is get fired, Fat brother and Maze will stand in the middle of the grid and playing a MORE special (hentai) game. (Maybe it’s the OOXX game which decrypted in the last problem, who knows.)
You can assume that the grass in the board would never burn out and the empty grid would never get fire.
Note that the two grids they choose can be the same.
Input
The first line of the date is an integer T, which is the number of the text cases.
Then T cases follow, each case contains two integers N and M indicate the size of the board. Then goes N line, each line with M character shows the board. “#” Indicates the grass. You can assume that there is at least one grid which is consisting of grass in the board.
1 <= T <=100, 1 <= n <=10, 1 <= m <=10
Output
For each case, output the case number first, if they can play the MORE special (hentai) game (fire all the grass), output the minimal time they need to wait after they set fire, otherwise just output -1. See the sample input and output for more details.
Sample Input
4
3 3
.#.
###
.#.
3 3
.#.
#.#
.#.
3 3
...
#.#
...
3 3
###
..#
#.#
Sample Output
Case 1: 1
Case 2: -1
Case 3: 0
Case 4: 2
【题意】:两个孩子在n*m的平地上放火玩,#表示草,两个熊孩子分别选一个#格子点火,火可以向上向下向左向右在有草的格子蔓延,点火的地方时间为0,蔓延至下一格的时间依次加一。求烧完所有的草需要的最少时间。如不能烧完输出-1。
依次枚举两个#格子,BFS出需要的时间,取最小的一个。
【代码】:
#include<cstdio>
#include<string>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<cstring>
#include<set>
#include<queue>
#include<algorithm>
#include<vector>
#include<map>
#include<cctype>
#include<stack>
#include<sstream>
#include<list>
#include<assert.h>
#include<bitset>
#include<numeric>
#define debug() puts("++++")
#define gcd(a,b) __gcd(a,b)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define fi first
#define se second
#define pb push_back
#define sqr(x) ((x)*(x))
#define ms(a,b) memset(a,b,sizeof(a))
#define sz size()
#define be begin()
#define pu push_up
#define pd push_down
#define cl clear()
#define lowbit(x) -x&x
#define all 1,n,1
#define rep(i,x,n) for(int i=(x); i<(n); i++)
#define in freopen("in.in","r",stdin)
#define out freopen("out.out","w",stdout)
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> P;
const int INF = 0x3f3f3f3f;
const LL LNF = 1e18;
const int maxn = 1e3 + 20;
const int maxm = 1e6 + 10;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int dx[] = {-1,1,0,0,1,1,-1,-1};
const int dy[] = {0,0,1,-1,1,-1,1,-1};
int dir[4][2] = {{0,1},{0,-1},{-1,0},{1,0}};
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int n,m,f,e,l;
char a[20][20];
int v[150][150];
struct node
{
    int x,y,step;
}st,ed,d[150];
bool ok(int x,int y)
{
    return x>=0 && y>=0 && x<n && y<m && !v[x][y] && a[x][y]=='#';
}
int bfs(node a,node b) //两点BFS
{
    ms(v,0);
    queue<node>q;
    v[a.x][a.y]=1;
    v[b.x][b.y]=1;
    q.push(a);
    q.push(b);
    f=0;
    while(!q.empty())
    {
        st = q.front();
        q.pop();
        for(int i=0; i<4; i++)
        {
            ed.x = st.x + dir[i][0];
            ed.y = st.y + dir[i][1];
            if(ok(ed.x,ed.y))
            {
                v[ed.x][ed.y] = 1;
                ed.step = st.step + 1;
                f = max(f,ed.step); //同时烧。选时间长的,因为先烧完也要的那个后烧完的。
                q.push(ed);
            }
        }
    }
    return f;
}
bool check()
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(a[i][j]=='#' && !v[i][j]) //在草坪但未访问——>还有没烧到的草坪
                return false; //则返回假
        }
    }
    return true;
}
int main()
{
    int t,cas=1;
    scanf("%d",&t);
    while(t--)
    {
        int k = 0;
        scanf("%d%d",&n,&m);
        getchar();
        for(int i=0;i<n;i++)
            scanf("%s",a[i]);
        rep(i,0,n)
        {
            rep(j,0,m)
            {
                if(a[i][j] == '#')
                {
                   d[k].x = i;
                   d[k].y = j;
                   d[k].step = 0;
                   k++; //k个有草坪的地方
                }
            }
        }
       int sum = INF;
       for(int i=0;i<k;i++) //枚举两个草坪组合
       {
           for(int j=0;j<k;j++)
           {
               int ans = bfs(d[i],d[j]); //ans是不同组合所花时间
               if(ans < sum && check()) //后面那个函数用来判断草坪都烧完了,选出最少时间烧完的组合
               {
                   sum = ans;
               }
           }
       }
      printf("Case %d: ",cas++);
      if(sum==INF) puts("-1");
      else printf("%d\n",sum);
    }
}
/*
4
3 3
.#.
###
.#.
3 3
.#.
#.#
.#.
3 3
...
#.#
...
3 3
###
..#
#.#
*/
												
											FZU 2150 Fire Game 【两点BFS】的更多相关文章
- FZU 2150 fire game (bfs)
		
Problem 2150 Fire Game Accept: 2133 Submit: 7494Time Limit: 1000 mSec Memory Limit : 32768 KB ...
 - FZU 2150 Fire Game --两点同步搜索
		
枚举两点,然后同步BFS,看代码吧,很容易懂的. 代码: #include <iostream> #include <cstdio> #include <cstring& ...
 - FZU  2150 Fire Game(BFS)
		
点我看题目 题意 :就是有两个熊孩子要把一个正方形上的草都给烧掉,他俩同时放火烧,烧第一块的时候是不花时间的,每一块着火的都可以在下一秒烧向上下左右四块#代表草地,.代表着不能烧的.问你最少花多少时间 ...
 - FZU 2150 Fire Game(点火游戏)
		
FZU 2150 Fire Game(点火游戏) Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description - 题目描述 ...
 - fzu 2150 Fire Game 【身手BFS】
		
称号:fzupid=2150"> 2150 Fire Game :给出一个m*n的图,'#'表示草坪,' . '表示空地,然后能够选择在随意的两个草坪格子点火.火每 1 s会向周围四个 ...
 - FZU 2150 Fire Game (暴力BFS)
		
[题目链接]click here~~ [题目大意]: 两个熊孩子要把一个正方形上的草都给烧掉,他俩同一时候放火烧.烧第一块的时候是不花时间的.每一块着火的都能够在下一秒烧向上下左右四块#代表草地,.代 ...
 - FZU 2150 Fire Game
		
Fire Game Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
 - (FZU 2150) Fire Game (bfs)
		
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2150 Problem Description Fat brother and Maze are playing ...
 - FZU 2150 Fire Game (bfs+dfs)
		
Problem Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board ...
 
随机推荐
- hdu 1856 More is better (并查集)
			
More is better Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others) ...
 - HDU 6153 A Secret(扩展KMP模板题)
			
A Secret Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 256000/256000 K (Java/Others) Total ...
 - 【题解】WC2008游览计划
			
写的第一道斯坦纳树的题目.斯坦纳树在信息学中的应用一般为:在\(n\)个点之间给定\(k\)条边并相应的边权,求在保证给定\(m\)个点联通的条件下的最小边权和.解决此类问题的方法即为SPFA + 状 ...
 - 在linux环境下让java代码生效的步骤
			
1.kill jboss 2.compile 3.deploy 4.bootstrap jboss.
 - bzoj 5099 [POI2018]Pionek 计算几何 极角排序
			
[POI2018]Pionek Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 269 Solved: 80[Submit][Status][Disc ...
 - Linux下只允许用户远程scp
			
本文将介绍在Linux环境下,让用户不能远程登录 只能使用scp命令 使用到的软件:rssh(http://pizzashack.org/rssh/index.shtml ) 环境:centos6.x ...
 - MySQL 8.0.11(zip)安装及配置
			
(1)下载MySQL8.0.11: (2)解压zip文件: 我解压到了D:/MySQL/mysql-8.0.11-winx64 (3)配置环境变量: 右键此电脑->属性 高级系统设置 环境变 ...
 - 代码管理工具 (含git、npm、gulp)
			
1 Git 分布式代码管理工具(基于Linux,可在本地进行提交)代码同时储存在本地和服务器中 ① Git基本操作命令 (1)初始化,创建初始化仓库 git init ------- 文件初始化,初始 ...
 - SSL步骤
			
SSL步骤 被认证的服务器 1.创建keystore 2.创建信任证书 3.导出信任证书供客户端使用 客户端 1.创建keystore(如果不存在) 2.导入信任证书
 - 【Foreign】阅读 [线段树][DP]
			
阅读 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output Sample Input 0 10 4 10 2 3 10 8 ...