• FZU


    题意,10*10的地图,有若干块草地“#”,草地可以点燃,并在一秒后点燃相邻的草地。有墙壁‘·‘阻挡。初始可以从任意两点点火。问烧完最短的时间。若烧不完输出-1.

    题解:由于100的数据量,直接暴力。枚举两个起点,推入队列,然后bfs。烧完就返回深度,更新一个min值。

    坑:(帮同学照bug)

    return t.step+1;bfs后没有算上最后一步

    ac代码

    #define  _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <string.h>
    #include <queue>
    #include <vector>
    using namespace std;
    char map[15][15];
    int vis[15][15];
    int T, n, m, ans, num;
    struct Node {
        int i, j, step;
        Node(int i = 0, int j = 0, int step = 0) :i(i), j(j), step(step) {}
    };
    int dir[4][2] = { { 1,0 },{ -1,0 },{ 0,1 },{ 0,-1 } };
    bool check(int i, int j) {
        if (i<0 || i >= n || j<0 || j >= m || vis[i][j] || map[i][j] == '.') return true;
        return false;
    }
    int bfs(int i, int j, int x, int y) {
        queue<Node>q;
        q.push(Node(i, j, 0)); q.push(Node(x, y, 0));
        vis[i][j] = 1; vis[x][y] = 1;
        int cnt;
        if (i == x&&j == y) cnt = 1;
        else cnt = 2;
        while (!q.empty()) {
            Node t = q.front();
            q.pop();
            for (int k = 0; k<4; k++) {
                int di = t.i + dir[k][0];
                int dj = t.j + dir[k][1];
                if (check(di, dj)) continue;
                q.push(Node(di, dj, t.step + 1));
                vis[di][dj] = 1;
                cnt++;
            }
            if (cnt >= num) { 
                //cout << i << ' ' << j << ' ' << x << ' ' << y <<' '<<t.step<< endl;
                return t.step+1; }
        }
        return -1;
    }
    int main() {
        scanf("%d", &T);
        for (int t = 1; t <= T; t++) {
            ans = (int)1e9; num = 0;
            scanf("%d%d", &n, &m);
            for (int i = 0; i<n; i++) {
                scanf("%s", map[i]);
                for (int j = 0; j<m; j++) if (map[i][j] == '#') num++;
            }
            if (num <= 2) { printf("Case %d: %d
    ", t, 0); continue; }
            for (int i = 0; i<n; i++) {
                for (int j = 0; j<m; j++) {
                    if (map[i][j] != '#') continue;
                    for (int x = 0; x<n; x++) {
                        for (int y = 0; y<m; y++) {
                            if (map[x][y] != '#') continue;
                            memset(vis, 0, sizeof(vis));
                            int tmp = bfs(i, j, x, y);
                            if (tmp>0) ans = min(ans, tmp);
                        }
                    }
                }
            }
            if (ans == (int)1e9) ans = -1;
            printf("Case %d: %d
    ", t, ans);
        }
    }
    成功的路并不拥挤,因为大部分人都在颓(笑)
  • 相关阅读:
    源码分析:①ReentrantLock之公平锁和非公平锁
    源码分析:同步基础框架——AbstractQueuedSynchronizer(AQS)
    java 同步锁:synchronized 关键字
    Java 中的锁优化
    Java 魔法类:Unsafe 解析
    实战:SpringBoot 2.3.0新特性之优雅停机
    实战:windows下使用docker部署springboot web demo项目
    版本控制SVN的使用笔记
    Maven项目管理:SpringMVC+Mybatis+Velocity整合笔记
    java常用集合总结
  • 原文地址:https://www.cnblogs.com/SuuT/p/8580618.html
Copyright © 2020-2023  润新知