Fire Game [kuangbin带你飞]专题一 简单搜索

点击打开链接

I - Fire Game
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d
& %I64u

Submit Status Practice FZU
2150

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

题目大意:

就是有两个人,他们想在n*m的草坪里OOXX,所以他们要把草坪里的草都烧光,就是问怎么样才能在最短时间

内烧完这些草(两个人可以同时烧一块草)

解题思路:

首先可以想到这是一个BFS, 然后分情况讨论,

1)当# <= 2的时候i,就肯定是0

2)当#的块数>2的时候,就肯定输出-1;

3)剩下的情况就是bfs了,只是还得考虑一下:是最长的路和最短的时间,

(因为可能有两块不一样的草坪,取那个长的的时间作为结果)

上代码:

/**
2015 - 09 - 17 晚上
Author: ITAK

Motto:

今日的我要超越昨日的我,明日的我要胜过今日的我,
以创作出更好的代码为目标,不断地超越自己。
**/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;
typedef long long LL;
const int maxn = 15;
const double eps = 1e-7;
bool vis[maxn*10][maxn*10];
const int dir[4][2]= {1, 0, 0, 1, -1, 0, 0, -1};
char map[maxn][maxn];
int m, n;
struct node
{
    int x, y, step;
}arr[maxn*10];
///p 和 q 表示那两个人放火的坐标
struct node p, q;

///以下就是bfs的基本套路,注意返回的最长的路径
int bfs(int x1, int y1, int x2, int y2)
{
    int Max = -99999;
    queue<node>que;
    p.x = x1, p.y = y1, p.step = 0;
    q.x = x2, q.y = y2, q.step = 0;
    que.push(p), que.push(q);
    while(!que.empty())
    {
        node end, start;
        start = que.front();
        que.pop();
        for(int i=0; i<4; i++)
        {
            int dx = start.x + dir[i][0];
            int dy = start.y + dir[i][1];
            if(!vis[dx][dy] && map[dx][dy]=='#' && dx>=0&&dx<m && dy>=0&&dy<n)
            {
                vis[dx][dy] = true;
                end.x = dx;
                end.y = dy;
                end.step = start.step + 1;
                que.push(end);
            }
        }
        Max = max(Max, start.step);
    }
    return Max;
}
int main()
{
    int T;
    scanf("%d",&T);
    for(int cas=1; cas<=T; cas++)
    {
        scanf("%d%d",&m, &n);
        int cnt = 0;///有多少个'#'
        for(int i=0; i<m; i++)
        {
            scanf("%s",map[i]);
            for(int j=0; j<n; j++)
            {
                if(map[i][j] == '#')
                {
                    cnt++;
                    arr[cnt].x = i;
                    arr[cnt].y = j;
                }
            }
        }
        printf("Case %d: ",cas);
        if(cnt <= 2)///如果小于2的话,肯定就是0了
        {
            puts("0");
            continue;
        }
        int ans = 999999;///最终的答案
        for(int i=0; i<cnt; i++)
        {
            for(int j=i; j<cnt; j++)
            {
                memset(vis, false, sizeof(vis));
                vis[arr[i].x][arr[i].y] = true;
                vis[arr[j].x][arr[j].y] = true;
                bool ok = false;
                int Min = bfs(arr[i].x, arr[i].y, arr[j].x, arr[j].y);
                ///枚举最长的块中的每个点
                for(int ii=0; ii<m; ii++)
                {
                    for(int jj=0; jj<n; jj++)
                    {
                        if(map[ii][jj] != '#')
                            continue;
                        if(!vis[ii][jj])
                        {
                            ok = true;
                            continue;
                        }
                    }
                    if(ok)
                        break;
                }
                if(!ok)
                    ans = min(Min, ans);
            }
        }
        if(ans == 999999)
            puts("-1");
        else
            cout<<ans<<endl;
    }
    return 0;
}
/**
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
**/
时间: 2024-09-20 15:43:59

Fire Game [kuangbin带你飞]专题一 简单搜索的相关文章

hdu 3038D - How Many Answers Are Wrong [kuangbin带你飞]专题五 并查集

点击打开链接   2015级新生如何加入ACM集训队?  How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4106    Accepted Submission(s): 1571 Problem Description TT and FF are ... friends. Uh...

hdu 1213 How Many Tables ([kuangbin带你飞]专题五 并查集)

点击打开链接 C - How Many Tables Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1213 Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know

hdu 1272 小希的迷宫[kuangbin带你飞]专题五 并查集

点击打开链接 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 36540    Accepted Submission(s): 11175 Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所

POJ 2236 A - Wireless Network[kuangbin带你飞]专题五 并查集

点击打开链接 A - Wireless Network Time Limit:10000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2236 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Medical team) have set up a wi

当架构师遇到互联网+:SACC2015带你飞

本文讲的是当架构师遇到互联网+:SACC2015带你飞,一年一度的中国系统架构师大会震撼来袭了! SACC2015即将于10月22日-24日在北京新云南皇冠假日酒店盛大召开,届时大会将云集来自五湖四海的2500名IT同胞们. 自2009年到现在,我们伴随着中国系统架构师大会走过了七个春秋,从最早500人规模逐年升级到现在2500人规模.回忆过往这些年,我们目睹了整个IT架构的变迁史,也见证了中国IT圈内一波又一波的架构师成长之路. 当天真遇到现实,会发生哪些趣闻轶事?当架构师遇到互联网+,又会擦

带你出国带你飞!阿里聚安全·算法挑战赛报名仅剩最后一天带你出国带你飞!阿里聚安全·算法挑战赛报名仅剩最后一天

 2017年03月01日 15:49  793 KDD(Knowledge Discovery and Data Mining,知识发现与数据挖掘)会议,作为数据挖掘界的顶级会议,一直是算法爱好者心中的圣地麦加. 想去怎么办? 聚聚很负责任的告诉你,我们提供奖金还包差旅,给你门票还带你飞! 但是,你得先报名~ 阿里聚安全 · 算法挑战赛3月2号报名截止,仅剩一天,抓紧上车! 赛事背景 随着网络技术的快速更新,新的黑客技术也层出不穷:在黑色产业链中,从业人员数据巨大,早前有新闻报道普通黑客也能月入

10 个原则让动画带你飞

本文讲的是10 个原则让动画带你飞, 去年我们发布了 Gyroscope 以来,许多人问过我们做动画用的什么 JavaScript 库,我们也曾想过将它公布于众,但实际上那并不是奥妙所在. 我们不想让大伙儿觉得自己需要依赖特别黑魔法的 JavaScript 插件才能解决问题.大部分时候,我们都只要对最新的浏览器和 GPU 的性能和 CSS3 加以利用就够了. 其实并没有什么绚丽动画的武功秘籍,唯一的办法就是花大量时间测试和优化.但是,在经过多年的试验和浏览器性能的极限考验,我们发现了一些设计和编

&amp;#9733;10 个实用技巧,让Finder带你飞~

10 个实用技巧,让 Finder 带你飞 Finder 是 Mac 电脑的系统程序,有的功能类似 Windows 的资源管理器.它是我们打开 Mac 首先见到的「笑脸」,有了它,我们可以组织和使用 Mac 里的几乎所有东西,包括应用程序.文件.文件夹.磁盘以及你网络上的共享磁盘,你同时可以通过它看到丰富的.高质量的文件预览. 接下来笔者将和你分享自己使用 Finder 的一些心得,正所谓 10 个技巧,让 Finder 带你「飞」. 1. 在 Finder 窗口显示更多信息 打开任意 Find

★10 个实用技巧,让Finder带你飞~

10 个实用技巧,让 Finder 带你飞 Finder 是 Mac 电脑的系统程序,有的功能类似 Windows 的资源管理器.它是我们打开 Mac 首先见到的「笑脸」,有了它,我们可以组织和使用 Mac 里的几乎所有东西,包括应用程序.文件.文件夹.磁盘以及你网络上的共享磁盘,你同时可以通过它看到丰富的.高质量的文件预览. 接下来笔者将和你分享自己使用 Finder 的一些心得,正所谓 10 个技巧,让 Finder 带你「飞」. 1. 在 Finder 窗口显示更多信息 打开任意 Find