zoukankan      html  css  js  c++  java
  • acwing 189. 乳草的入侵 bfs

    地址 https://www.acwing.com/solution/content/15240/

    农民约翰一直努力让他的草地充满鲜美多汁而又健康的牧草。
    
    可惜天不从人愿,他在植物大战人类中败下阵来。
    
    邪恶的乳草已经在他的农场的西北部份占领了一片立足之地。
    
    草地像往常一样,被分割成一个高度为Y, 宽度为X的直角网格。
    
    (1,1)是左下角的格(也就是说坐标排布跟一般的X,Y坐标相同)。
    
    乳草一开始占领了格(Mx,My)。
    
    每个星期,乳草传播到已被乳草占领的格子四面八方的每一个没有很多石头的格(
    
    包括垂直与水平相邻的和对角线上相邻的格)内。
    
    1周之后,这些新占领的格又可以把乳草传播到更多的格里面了。
    
    达达想要在草地被乳草完全占领之前尽可能的享用所有的牧草。
    
    她很好奇到底乳草要多久才能占领整个草地。
    
    如果乳草在0时刻处于格(Mx,My),
    
    那么几个星期以后它们可以完全占领入侵整片草地呢(对给定的数据总是会发生)?
    
    在草地地图中,”.”表示草,而”*”表示大石。
    
    比如这个X=4, Y=3的例子。
    
    ....
    ..*.
    .**.
    如果乳草一开始在左下角(第1排,第1列),那么草地的地图将会以如下态势发展:
    
          ....  ....  MMM.  MMMM  MMMM  
          ..*.  MM*.  MM*.  MM*M  MM*M  
          M**.  M**.  M**.  M**.  M**M  
    星期数  0     1     2     3     4
    乳草会在4星期后占领整片土地。
    
    输入格式
    第1行: 四个由空格隔开的整数: X, Y, Mx, My
    第2到第Y+1行: 每行包含一个由X个字符(”.”表示草地,”*”表示大石)构成的字符串,共同描绘了草地的完整地图。
    
    输出格式
    输出一个整数,表示乳草完全占领草地所需要的星期数。
    
    数据范围
    1≤X,Y≤100
    输入样例:
    4 3 1 1
    ....
    ..*.
    .**.
    输出样例:
    4

    算法1
    读入有毒 XY要转换下
    其他没什么了

    BFS 以队列Q为空作为退出时机,其实不太需要进行计数cnt 。
    标记是否访问数组 其实可以检查数组元素是 . M * 就可以了

    // 123124.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    #include <vector>
    #include <queue>
    
    
    using namespace std;
    
    /*
    输入样例:
    4 3 1 1
    ....
    ..*.
    .**.
    输出样例:
    4
    */
    const int N = 110;
    int n, m, inx, iny;
    char g[N][N];
    int dir[8][2] = {
        {-1,-1},{-1,0},{-1,1},
        {0,-1},{0,1},
        {1,-1},{1,0},{1,1}
    };
    
    
    int main()
    {
        cin >> n >> m >> inx >> iny;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                cin >> g[i][j];
            }
        }
        //x y 调转
        int startx = m-iny;
        int starty = inx -1;
        int ans = 0;
    
        queue<vector<int>> Q;
        Q.push({ startx ,starty,0 });
        g[startx][starty] = 'M';
    
        while (Q.size()) {
            int x = Q.front()[0];
            int y = Q.front()[1];
            int day = Q.front()[2];
            ans = day;
            Q.pop();
    
            for (int i = 0; i < 8; i++) {
                int newx = x + dir[i][0];
                int newy = y + dir[i][1];
    
                if (newx >= 0 && newx < m && newy >= 0 && newy < n && g[newx][newy] == '.') {
                    g[newx][newy] = 'M';
                    Q.push({ newx ,newy,day+1});
                }
            }
        }
    
    
        cout << ans << endl;
    
    
        return 0;
    }
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    .NET题目(收集来自网络)
    c#反射
    c#泛型
    asp.net core 下载文件,上传excel文件
    remote: HTTP Basic: Access denied fatal: Authentication failed for'https'
    获取jwt(json web token)中存储的用户信息
    System.data.sqlclient.sqlexception:将截断字符串或二进制数据终止
    代码热更新
    左手坐标系 vs 右手坐标系
    GPU相关临时笔记
  • 原文地址:https://www.cnblogs.com/itdef/p/13190495.html
Copyright © 2011-2022 走看看