Educational Codeforces Round 1, problem: (D) Igor In the Museum 【dfs】

题意

给定一个nm的地图,有k次查询。每次查询,询问位置(x,y)的点连通块周围有多少个

思路

统计每个“.”周围“ * ”的数量,每次选取一个未被标记过的“.”开始往四周dfs,累加同一个连通块中每个“.”四周的“ * ”的数量作为该连通块的答案,并在dfs过程中给该连通块中点打上标记,这样查询的时候只需要查询该点所属连通块的答案即可

code

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn=1e3+5;
char mp[maxn][maxn];
int ans[maxn],vis[maxn][maxn];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int n,m,k;
int cnt,id;
void dfs(int x,int y){
    vis[x][y]=id;
    for(int i=0;i<4;i++){
        int xx=x+dx[i],yy=y+dy[i];
        if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!vis[xx][yy]){
            if(mp[xx][yy]=='*') ++cnt;
            else dfs(xx,yy);
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m>>k;
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++) cin>>(mp[i]+1);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(mp[i][j]=='.'&&!vis[i][j])
                cnt=0,++id,dfs(i,j),ans[id]=cnt;
        }
    }
    while(k--){
        int x,y;
        cin>>x>>y;
        cout<<ans[vis[x][y]]<<endl;
    }
    return 0;
}
学如逆水行舟,不进则退
发布了491 篇原创文章 · 获赞 1203 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/weixin_42429718/article/details/104201833