• Fire Game FZU 2150


    题目链接:  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
    ", t++);
            else
                printf("Case %d: %d
    ", 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
  • 相关阅读:
    poj2187 Beauty Contest (凸包 + 旋转卡壳)
    codevs1298, hdu1392 (凸包模板)
    Codeforces Round #427 (Div. 2) E. The penguin's game (交互题,二进制分组)
    poj1655 Balancing Act (dp? dfs?)
    poj1654 -- Area (任意多边形面积)
    codeforces#426(div1) B
    poj1011 Sticks (搜索经典好题)
    考试题
    使用SMM框架开发企业级应用-----打印机案例
    使用SMM框架开发企业级应用-----Spring简介即Spring Ioc
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5682236.html
Copyright © 2020-2023  润新知