日常刷题2025-3-16
日常刷题2025-3-16
C - Humidifier 3
棕色
思路:bfs+多源最短路
好久没写bfs了,看到这种题都想不起他。只想到了dfs。但是这题用dfs做不了,dfs还是不叫适合求路径。这种求距离的题还是得交给bfs
代码
#include <bits/stdc++.h>
using u64 = unsigned long long;
using i64 = long long;
typedef std::pair<int, int> pii;
const int mod = 998244353;
const long long LINF = 1e18;
const int N = 1005;
int n, m, d;
std::queue<pii> que;
std::vector<std::string> a(N);
int dis[N][N];
int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
void solve(){
std::cin>>n>>m>>d;
for(int i=0;i<n;i++){
std::cin>>a[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
dis[i][j]=1e9;
if(a[i][j]=='H'){
que.push({i,j});
dis[i][j]=0;
}
}
}
while(!que.empty()){
auto [x, y]=que.front(); que.pop();
for(int i=0;i<4;i++){
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(dx<0||dx>=n||dy<0||dy>=m||a[dx][dy]=='#'||dis[dx][dy]!=1e9) continue;
dis[dx][dy]=dis[x][y]+1;
que.push({dx,dy});
}
}
int ans = 0;
for(int i=0;i<n;i++) for(int j=0;j<m;j++) if(dis[i][j]<=d) ans++;
std::cout<<ans<<'\n';
}
signed main(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(15);
int t = 1, i;
for (i = 0; i < t; i++){
solve();
}
return 0;
}

浙公网安备 33010602011771号