题目链接:  http://acm.hust.edu.cn/vjudge/contest/121377#problem/I

 

题意; 现给出一个 n * m的表格, 其中 "#" 代表是放有干草的格子。 两兄弟在做游戏, 他们总共任取两个在放有干草的地方放火, 这些火只能在上下左右四个方向且有干草的地方蔓延,问你最短的时间让整个表格的干草都燃烧到是多少?若不能让整个表格的干草都燃烧,则输出"-1"

注意到 1<=n<= 10  &&  1<=m<=10  所以直接进行 BFS 搜索即可

 

 

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <vector>
#include <queue>
using namespace std;
typedef long long LL;
const int oo = 0xfffffff;
const int maxn = 110007;
char maps[20][20];
int v[20][20];
int n, m, cnt, t;
int dir[4][2] = {{0, 1},{1, 0},{0, -1}, {-1, 0}};
struct node
{
    int x, y, step;
} s[500];

int OK()
{
    for(int i=0; i<n; i++)
    for(int j=0; j<m; j++)
    {
        if(maps[i][j] == '#' && !v[i][j])
            return 0;
    }
    return 1;
}

int BFS(node s, node e)
{
    queue<node>Q;
    Q.push(s);
    Q.push(e);
    v[s.x][s.y]=1;
    v[e.x][e.y]=1;
    node q;

    while(Q.size())
    {
         q = Q.front();
        Q.pop();

        for(int i=0; i<4; i++)
        {
            node k;
            k.x = q.x + dir[i][0];
            k.y = q.y + dir[i][1];

            if(k.x>=0 && k.x<n && k.y>=0 && k.y<m && maps[k.x][k.y]=='#' && !v[k.x][k.y])
            {
                v[k.x][k.y] = 1;
                k.step = q.step + 1;
                Q.push(k);
            }
        }
    }

    return q.step;
}

void solve()
{
    int i, j, ans;
    ans = oo;
     for(i=0; i<cnt; i++)
        for(j=i; j<cnt; j++)
        {
            memset(v, 0, sizeof(v));
            int L = BFS(s[i], s[j]);

            if(L < ans && OK())
                ans = L;
        }

        if(ans == oo)
            printf("Case %d: -1\n", t++);
        else
            printf("Case %d: %d\n", t++, ans);
}
int main()
{
    int T;

    t = 1;
    scanf("%d", &T);

    while(T --)
    {
        scanf("%d %d", &n, &m);

        for(int i=0; i<n; i++)
            scanf("%s", maps[i]);

        cnt = 0;


        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m; j++)
                if(maps[i][j] == '#')
                {
                    s[cnt].x=i, s[cnt].y = j, s[cnt].step = 0;
                    cnt ++ ;
                }
        }

         solve();

    }
    return 0;
}
View Code

 

posted on 2016-07-18 18:11  不忧尘世不忧心  阅读(297)  评论(0编辑  收藏  举报