日常刷题2025-3-16

日常刷题2025-3-16

C - Humidifier 3

棕色

https://atcoder.jp/contests/abc383/tasks/abc383_c

思路: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;
}
posted @ 2025-03-16 12:18  califeee  阅读(13)  评论(0)    收藏  举报