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. 译:什么是ViewData的, ViewBag和TempData? - MVC为当前和后续请求之间传递数据的三种方法

    译文出处:http://www.codeproject.com/Articles/476967/WhatplusisplusViewData-cplusViewBagplusandplusTem AS ...

  2. 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  3. web ppt

    先记录,以后再试试 https://github.com/gnab/remark/wiki http://segmentfault.com/blog/sweetdum/1190000000484121 ...

  4. 关于SQL2008 “不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了‘阻止保存要求重新创建表的更改’” 解决方案

    不允许保存更改.您所做的更改要求删除并重新创建以下表.您对无法重新创建的标进行了更改或者启用了“阻止保存要求重新创建表的更改” 解决方法:  打开SQL SERVER 2008 工具-->选项- ...

  5. PHP KMP算法实现

    function getNext( $str ){ $ret = array(0=>0); for( $j =1; $j < strlen($str); $j++ ){ $_s = sub ...

  6. 自定义HttpMessageHandler实现HTTP方法的重写

    自定义HttpMessageHandler实现HTTP方法的重写

  7. bootstrap glyphicon图标无法显示

    如果不注意bootstrap引入css和fonts的规范,则可能会导致bootstrap 在显示glyphicon图标时无法正常显示,显示为方框. 此时可搜索bootstrap.css中的.glyph ...

  8. SharePoint DateTimeControl 使用

    首先,需要引用: <%@ Register TagPrefix="SharePoint" Namespace="Microsoft.SharePoint.WebCo ...

  9. 复杂表格的树形结构的添加删除行div实现

    公司倒闭,换了工作,无奈选择了做外包这个差事,大公司进不去,小公司工资太低,可能也只能如此了.但无奈之举,亦不可浪费时间,多多磨练自己吧! 众所周知,做外包项目,其实就是做一些大公司的内部系统,多以管 ...

  10. python初识(2)

    1.关于编码转换的方式. 比如,讲utf-8的编码转换为unicode方式如下 #-*- coding:utf-8 -*- i="德玛西亚" i_unicode=i_decode( ...