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. .net4.0注册到IIS ,重新注册IIS ,iis注册

    IIS和.netfw4.0安装顺序是从前到后,如果不小心颠倒了,无所谓. 打开程序-运行-cmd:输入一下命令重新注册IIS C:\WINDOWS\Microsoft.NET\Framework\v4 ...

  2. 【转】MSMQ 微软消息队列 简单 示例

    MSMQ它的实现原理是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中:本地或者是异地的消息接收程 ...

  3. C#递归题目代码

    一列数的规则如下: 1.1.2.3.5.8.13.21.34...... 求第30位数是多少, 用递归算法实现. 代码: public class MainClass { public static ...

  4. MYSQL企业常用架构与调优经验分享

    一.选择Percona Server.MariaDB还是MYSQL  mysql应用源码:http://www.jinhusns.com/Products/Download/?type=xcj 1.M ...

  5. sqlserver工作日常使用sql--持续完善中

    select STUFF('232',1,1,'')结果为32,从第一个字符开始去掉一个字符,及去掉 select CONCAT('-','asd')结果为-asd,连接两个字符串 select co ...

  6. sql:MySQL 6.7 表,视图,存储过程结构查询

    #数据库MySQL 6.7 use sakila; #查询表名 show tables; # SELECT TABLE_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA. ...

  7. LeetCode130:Surrounded Regions

    题目: Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is capt ...

  8. 使用SignalR+Asp.net创建实时聊天应用程序

    一.概述: 使用 ASP.NET 那么 SignalR 2 创建一个实时聊天应用程序.将 SignalR 添加 MVC 5 应用程序中,并创建聊天视图发送并显示消息. 在Demo中,将学习Signal ...

  9. question about import google file

    1. question descibe; once, one css file(app.css) of my web project has sentence like this: @import u ...

  10. [Tool] 使用StyleCop验证命名规则

    [Tool] 使用StyleCop验证命名规则 前言 微软的MSDN上,有提供了一份微软的命名方针,指引开发人员去建立风格一致的程序代码. http://msdn.microsoft.com/zh-t ...