题意
给定一个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;
}
学如逆水行舟,不进则退