Problem 2150 Fire Game

Accept: 145    Submit: 542
Time Limit: 1000 mSec    Memory Limit : 32768 KB

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. 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

Submit Back Status

::今天组队赛我的时间基本都用在这道题上了,马力不强,还是要多注意细节

主要思路:  bfs 。。先bfs遍历看图的连通分量tree。若tree>2,则直接输出-1.

若tree==2,则相当于要遍历两个子图,枚举两个图遍历的起点。

若tree==1,则只要遍历一个图,注意这里可以同时点燃2个草地,枚举1个起点,固定,再枚举第2个起点。

下面的代码现在看自己都有点恐惧,汗:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
using namespace std;
const int INF=;
const int maxn=+;
const int mod=;
typedef long long ll;
struct node
{
int x,y,st;
};
int t;
char g[][];
int biao[][],tt[][];
int dx[]={,,,-};
int dy[]={,-,,};
queue<node> q; int bfs(int x,int y)
{
node u,v;
biao[x][y]=;
int ans=;
u.x=x;u.y=y;u.st=;
q.push(u);
while(!q.empty())
{
u=q.front();
q.pop();
for(int i=; i<; i++)
{
int x1=u.x+dx[i],y1=u.y+dy[i];
if(g[x1][y1]=='#'&&biao[x1][y1]==)
{
biao[x1][y1]=;
v.x=x1;v.y=y1;v.st=u.st+;
q.push(v);
ans=max(v.st,ans);
}
}
}
return ans;
} int bfs2(int x,int y,int a,int b)
{
node u,v;
biao[x][y]=;
biao[a][b]=;
int ans=;
u.x=x;u.y=y;u.st=;
q.push(u);
u.x=a;u.y=b;u.st=;
q.push(u);
while(!q.empty())
{
u=q.front();
q.pop();
for(int i=; i<; i++)
{
int x1=u.x+dx[i],y1=u.y+dy[i];
if(g[x1][y1]=='#'&&biao[x1][y1]==)
{
biao[x1][y1]=;
v.x=x1;v.y=y1;v.st=u.st+;
q.push(v);
ans=max(v.st,ans);
}
}
}
return ans;
} int is_ok(int n,int m)
{
memset(biao,,sizeof(biao));
int i,j;
for(i=; i<=n ;i++)
{
for(j=; j<=m; j++)
{
if(g[i][j]=='#')
{
bfs(i,j);
break;
}
}
if(j<=m) break;
} for(i=; i<=n ;i++)
{
for(j=; j<=m; j++)
{
if(g[i][j]=='#'&&biao[i][j]==)
{
bfs(i,j);
break;
}
}
if(j<=m) break;
}
if(i>n) return ; for(i=; i<=n; i++)
{
for(j=; j<=m; j++)
{
if(g[i][j]=='#'&&biao[i][j]==)
return ;
}
}
return ;
} void fu(int n,int m,int a[][],int b[][])
{
for(int i=; i<=n; i++)
{
for(int j=; j<=m; j++)
a[i][j]=b[i][j];
}
} void run()
{
int T,cas=;
scanf("%d",&T);
while(T--)
{
int n,m,i;
scanf("%d%d",&n,&m);
for(i=; i<=m+; i++)//把边界附上值' .',方便后来处理
{
g[][i]='.';
g[n+][i]='.';
}
for(int i=; i<=n; i++)
{
scanf("%s",g[i]+);
g[i][]=g[i][m+]='.';//
}
int j,k,h,a,b,ans=INF;
//show(n,m);
int tree=is_ok(n,m);
printf("Case %d: ",cas++);
if(tree==) {printf("-1\n"); continue;} for(i=; i<=n; i++)
{
for(j=; j<=m ;j++)
{
if(g[i][j]=='#')
{
memset(biao,,sizeof(biao));
if(tree==)//两个子图
{
a=bfs(i,j);
for(k=i; k<=n; k++ )
{
if(k==i) h=j+;
else h=;
for( ;h<=m ; h++)
{
if(biao[k][h]==&&g[k][h]=='#')
{
fu(n,m,tt,biao);
b=bfs(k,h);
fu(n,m,biao,tt);
int tmp=max(a,b);
ans=min(tmp,ans);
}
}
} }
else//一个子图,固定起点i,j,枚举其后的点
{
for(k=i; k<=n; k++)
{
if(i==k) h=k+; else h=;
for(; h<=m; h++)
{
biao[i][j]=;
if(biao[k][h]==&&g[k][h]=='#')
{
a=bfs2(i,j,k,h);
ans=min(ans,a);
memset(biao,,sizeof(biao));
}
}
} }
} }
}
if(ans==INF) ans=;
printf("%d\n",ans);
}
} int main()
{
//freopen("in.txt","r",stdin);
run();
return ;
}

FZU Problem 2150 Fire Game的更多相关文章

  1. FZU Problem 2150 Fire Game(bfs)

    这个题真要好好说一下了,比赛的时候怎么过都过不了,压点总是出错(vis应该初始化为inf,但是我初始化成了-1....),wa了n次,后来想到完全可以避免这个问题,只要入队列的时候判断一下就行了. 由 ...

  2. FZOJ Problem 2150 Fire Game

                                                                                                        ...

  3. FZU 2150 fire game (bfs)

    Problem 2150 Fire Game Accept: 2133    Submit: 7494Time Limit: 1000 mSec    Memory Limit : 32768 KB ...

  4. FZU 2150 Fire Game(点火游戏)

    FZU 2150 Fire Game(点火游戏) Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description - 题目描述 ...

  5. fzu 2150 Fire Game 【身手BFS】

    称号:fzupid=2150"> 2150 Fire Game :给出一个m*n的图,'#'表示草坪,' . '表示空地,然后能够选择在随意的两个草坪格子点火.火每 1 s会向周围四个 ...

  6. UVA Problem B: Fire!

    Problem B: Fire! Joe works in a maze. Unfortunately, portions of the maze have caught on fire, and t ...

  7. FZu Problem 2233 ~APTX4869 (并查集 + sort)

    题目链接: FZu Problem 2233 ~APTX4869 题目描述: 给一个n*n的矩阵,(i, j)表示第 i 种材料 和 第 j 种材料的影响值,这个矩阵代表这n个物品之间的影响值.当把这 ...

  8. FZu Problem 2236 第十四个目标 (线段树 + dp)

    题目链接: FZu  Problem 2236 第十四个目标 题目描述: 给出一个n个数的序列,问这个序列内严格递增序列有多少个?不要求连续 解题思路: 又遇到了用线段树来优化dp的题目,线段树节点里 ...

  9. 翻翻棋(找规律问题)(FZU Problem 2230)

    题目是这样的: FZU Problem 2230 象棋翻翻棋(暗棋)中双方在4*8的格子中交战,有时候最后会只剩下帅和将.根据暗棋的规则,棋子只能上下左右移动,且相同的级别下,主动移动到地方棋子方将吃 ...

随机推荐

  1. 收集了50道基础的java面试题

    下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最 ...

  2. PHP的加密解密字符串函数

    程序中经常使用的PHP加密解密字符串函数 代码如下: /********************************************************************* 函数 ...

  3. C#语言各种集合介绍

    集合,表示可以通过遍历每个元素来访问的一组对象(特别是可使用foreach循环访问)一个集合包括多个元素,即有一个集合类对象和N个元素对象 因为任何集合类都实现了IEnumerable接口,所以任何集 ...

  4. java数据库查询类

    通用查询数据库辅助类,可实现任意查询语句的查询,还可以进行多结果集查询. 类的代码: package com.hongyuan.db; import java.math.BigDecimal; imp ...

  5. 【JS复习笔记】02 对象与函数

    好吧,因为很重要的事情,几天没写笔记了. 关于对象: ||可以用来填充默认值,如:myApp.name || "无" &&可以用来避免错误,myApp.NameOb ...

  6. struts2进阶篇(5)

    一.OGNL简介 OGNL (Object-Graph Navigation Language)的缩写,简称对象图导航语言. OGNL表达式的特特点: >能够取对象的属性,也能调用对象的方法. ...

  7. java事务理解

    还在学Hibernate,后续一大堆概念刚接触需要理解.觉得-——事务——这个概念不是很好理解,所以发上来记录一下. 首先说点千篇一律的东西.概念和特性都是随处可见的,无论哪里都很容易找到,关键是你如 ...

  8. spring中常用工具类介绍

    http://www.cnblogs.com/langtianya/p/3875103.html 文件资源操作     Spring 定义了一个 org.springframework.core.io ...

  9. web安全——系统(Linux)

    简介 最小(少)原则,是安全的重要原则.最小的权限,最小的用户,最少的服务,最少的进程,是最安全的. 系统安全包括:文件系统保护.用户管理安全.进程的保护以及日志的管理. 场景 确保服务最少,每个都是 ...

  10. [Architecture Pattern] Repository实作查询功能

    [Architecture Pattern] Repository实作查询功能 范例下载 范例程序代码:点此下载 问题情景 在系统的BLL与DAL之间,加入Repository Pattern的设计, ...