题解:AT_abc383_c [ABC383C] Humidifier 3
zhengyi0402 · · 题解
ABC383 C题题解
数据范围
主思路
这题我会使用广度优先搜索。
首先将加湿器入队,并将其标为加湿过。
然后套广度优先搜索模板即可。
注意,队列要有三个数,需要使用结构体。
代码
#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见祖宗。
}
如果有人能提供反例,可以发给我,我会尽快修改。
对了,如果上述内容你都看懂了,那么恭喜你!