首页 > 试题广场 >

小d和超级泡泡堂

[编程题]小d和超级泡泡堂
D 在某天醒来发现自己穿越到了小游戏《超级泡泡堂》的世界,他得到了一份地图,一个技能和三个提示。

这个地图共有 nm 列,行从上到下按 1 ~ n 编号,列从左到右按 1 ~ m 编号。地图上存在空地、石头、杂草。

这个技能是在自己当前所在位置放置一个不会对自己造成影响的炸弹,炸弹爆炸会产生火焰,火焰会向上下左右四个方向蔓延,如果火焰的蔓延方向上为空地,则会直接蔓延到空地并且在空地上开始继续蔓延,如果火焰的蔓延方向上为杂草,则会将杂草烧掉使其变为空地, 并且在新产生的空地继续蔓延,如果火焰蔓延方向上为石头,则无法继续朝这个方向蔓延,当然,火焰不可能蔓延到地图外。

三个提示分别是:

1、你可以向上下左右四个方向移动,如果那个方向上不是石头且不会移动到地图外。

2、你的技能只能使用一次。

3、你只有正确回答你最多能通过使用技能使多少杂草地变为空地才能够回到现实世界。

D 非常想要回去现实世界玩原神,请你帮助他计算出他最多能通过使用技能使多少杂草地变为空地。

\textbf{ 注:当火焰蔓延到另一个地方将要继续蔓延时,蔓延方式等同于在该地方重新放置炸弹。 }

输入描述:

第一行包含两个整数 n, m(1\leq n,m\leq 1000)

接下来 n 行每行 m 个字符,其中 '.' 表示空地,'#' 表示石头,‘!' 表示杂草,‘@’ 表示小 D 当前所处位置。



输出描述:
输出一行包含一个整数表示他最多能通过使用技能使多少杂草地变为空地。
示例1

输入

4 4
..!.
.@.#
!##!
#!!!

输出

2
猫猫真傻,真的。猫猫还以为是小d只能烧除自己以外的其他联通快呢喵。
然后费劲巴拉的模拟了一个只排除@其他地方全烧的代码喵!
结果发现是只烧自己的连通块喵!甚至就算我误解的题面,也只用全体减去小d所在的连通块就可以了喵!
猫猫真傻,真的。。。

其实这道题是一道简单的bfs连通块问题喵~(连通块的意思是没有被石头阻挡的空地组成的一大块)
因为火的蔓延方式等同于在该地方重新放置炸弹喵!所以在一个连通块里边在哪里放火都无所谓喵!
又因为小d只能在本连通块上放炸弹,所以答案就是在小d所在连通块上的草地的数量喵~
接下来实现代码就非常简单了喵~直接看代码就可以了喵。
猫猫提供了详细的注释喵~

#include <bits/stdc++.h>
using namespace std;
using ll=long long;

int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};

int main() {
    int n,m;cin >> n >> m;
    vector<string> mp(n);//表示地图,就是该座标是“空地,石头,杂草还是小d”
    vector<vector<bool>> biao(n,vector<bool>(m,0));//标记是不是已经烧过了
    for(int i=0;i<n;i++) cin >> mp[i];

    queue<pair<int,int>> q;//bfs用排列
    int ans=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(mp[i][j]=='@')//找到小d的位置
            {
                q.push({i,j});//放炸弹
                break;
            }
        }
    }
    while(!q.empty())
    {
        int x=q.front().first,y=q.front().second;//火的坐标
        q.pop();//烧过了就删掉

        if(x<0||x>=n||y<0||y>=m) continue;//烧出地图了
        if(biao[x][y]) continue;//已经烧过了
        if(mp[x][y]=='#') continue;//是石头

        biao[x][y]=1;//标记已经烧过了
        if(mp[x][y]=='!') ans++;//烧到草了

        for(int i=0;i<4;i++)//上下左右全烧一遍
        {
            q.push({x+dx[i],y+dy[i]});//把新烧的坐标放进去
        }
    }
    cout << ans;
}
/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣤⡀⣀⣠⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⡀⢀⣴⣾⣷⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⠿⠛⠛⠉⠉⠉⠉⠉⠉⠛⠻⠿⣿⣿⣿⣿⣿⣶⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⡿⠿⠛⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠿⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣀⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⣰⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣠⣾⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣶⣄⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣻⣿⣿⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⢹⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⠁⠈⢢⡀⠀⠀⠀⢸⡇⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⡟⠒⢦⡀⠀⠀⠀
⠀⠀⣠⣤⣤⣼⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡇⠀⠀⠀⠉⢢⣄⠀⠀⢿⠊⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣷⡄⠀⢷⠀⠀⠀
⠀⢰⠇⠀⣰⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⡌⣹⠗⠦⣬⣇⠀⠉⢢⡀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡀⢸⡄⠀⠀
⠀⡟⠀⣼⣯⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣆⢹⡀⠀⠀⠀⠉⠁⠀⠀⢀⣀⡁⠀⠀⠉⠳⢴⡆⠀⠀⠀⠀⠀⠀⢹⣧⠈⡇⠀⠀
⠀⡇⠀⠀⢻⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣾⠻⠉⠛⠂⠀⠀⠀⠀⠀⠀⠻⠿⣿⣿⣿⣶⣦⡀⠛⣇⠀⠀⠀⠀⠀⣈⣿⠀⡇⠀⠀
⢸⡇⠀⠀⢠⣿⣷⣦⣀⡸⣷⣦⣶⡂⠉⠉⠉⢁⣤⣶⡶⠀⠀⠀⣀⣀⡴⠀⠀⠀⠀⠀⠀⠈⠉⠉⠁⠀⡟⢀⣴⣟⣰⣾⣿⣏⣠⠇⠀⠀
⠈⡇⠀⠀⢸⣿⠁⠉⣿⠛⠛⠃⡇⠀⠀⢠⣶⣿⡿⠛⠁⠀⠀⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠼⢿⠟⠿⢿⡏⠀⠘⣿⡀⠀⠀⠀
⠀⢷⣀⣀⣿⠇⠀⠀⢿⡇⠀⢀⢱⡀⠀⠛⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠀⠀⢸⠇⠀⠀⢹⣿⣄⠀⠀
⠀⠀⣉⣿⡏⠀⠀⠀⠀⠀⠀⢸⣇⣳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⣿⠃⠀⠀⠀⠀⠀⠀⣿⠈⢧⠀
⠀⠘⣿⣿⠁⠀⠀⠀⠀⠀⠀⠘⣿⡛⣶⠀⠀⣠⠔⠒⠛⠒⠦⡀⠀⠀⠀⠀⣠⡤⠶⠤⢤⣀⠀⠀⠀⢀⣏⡄⠀⠀⠀⠀⠀⡀⣿⡆⠈⣧
⣠⡾⠛⣿⣿⣧⠀⠀⠀⠀⢸⣿⠾⢿⡿⠀⣰⠃⠀⠀⠀⠀⠀⢹⡄⠀⠀⡼⠁⠀⠀⠀⠀⠈⠙⣦⠀⢸⣿⡇⣾⣣⡀⠀⢰⣿⣿⣿⣤⠾
⡟⠀⠀⠻⣿⡟⢷⡄⣤⡀⠈⣿⡀⣸⠇⠀⠏⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⡇⢀⡀⠀⠀⠀⠀⢀⡟⠀⠀⠋⣿⣿⣿⡇⣠⣿⠿⠛⢷⡀⠀
⠀⠀⠀⠀⣿⣇⣨⣿⣿⣿⣦⣽⣷⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠃⠀⠙⠢⠤⠤⠴⢾⠀⠀⠀⠀⢸⣷⣿⣿⠟⠁⠀⠀⠈⣧⠀
⠀⠀⠀⠀⠈⠉⠉⠁⠈⠉⠈⢉⣿⡁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⣿⠀
*/


发表于 今天 10:40:43 回复(0)
这个题目的情景,加上炸弹和火焰分开描述,我还以为是找最优的十字覆盖呢,结果还是flood fill(
发表于 今天 00:26:45 回复(0)