题解:AT_abc383_c [ABC383C] Humidifier 3

· · 题解

ABC383 C题题解

数据范围

1 \le n,m \le 1000 1 \le d \le n \times m

主思路

这题我会使用广度优先搜索。

首先将加湿器入队,并将其标为加湿过。

然后套广度优先搜索模板即可。

注意,队列要有三个数,需要使用结构体。

代码

#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f3fll
using namespace std;
int n,m,d;
char c[1111][1111];
bool vis[1111][1111];
int dx[5]={0,-1,0,1,0},dy[5]={0,0,-1,0,1};
struct node{
    int x;
    int y;
    int num;//扩展的步数 
};
queue<node> q;
signed main(){
    cin>>n>>m>>d;
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            cin>>c[i][j];
            if(c[i][j]=='H'){
                vis[i][j]=1;
                q.push({i,j,0});
            }
        }
    }
    int ans = 0;
    while(!q.empty()){
        node xx = q.front();q.pop();
        if(xx.num>=d){
            continue;
        }
        for(int i = 1;i <= 4;i++){
            int tx = xx.x+dx[i],ty=xx.y+dy[i];
            if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&!vis[tx][ty]&&c[tx][ty]!='#'){
                vis[tx][ty]=1;
                q.push({tx,ty,xx.num+1});
            }
        }
    }
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            if(vis[i][j]==1&&c[i][j]!='#'){
//              cout<<c[i][j];
                ans++;
            }
        }
    }
    cout<<ans;
    return 0;
    //十年OI一场空,define int 见祖宗。
    //十年OI一场空,不开long long见祖宗。
}

如果有人能提供反例,可以发给我,我会尽快修改。

对了,如果上述内容你都看懂了,那么恭喜你!