洛谷P1596 [USACO10OCT]湖计数Lake Counting
https://www.luogu.org/problemnew/show/P1596
连通块水题...
大体思路是找到是水坑的坐标然后就开始不断递归,往八个方向搜,把连在一起的都标记一遍直到找不到为止
以下是本蒟蒻的代码
#include <bits/stdc++.h>//万能头 using namespace std; char a[101][101]; int fx[9]={0,-1,-1,-1,0,0,1,1,1};//x方向 int fy[9]={0,-1,0,1,-1,1,-1,0,1};//y方向 int n,m,ans=0; void dfs(int x,int y) { a[x][y]='.';//标记已经搜过 int dx,dy; for(int i=0; i<=8; i++) { dx=x+fx[i]; dy=y+fy[i]; if(dx<1||dx>n||dy<1||dy>m||a[dx][dy]=='.') continue;//判断是否越界或已经搜过 dfs(dx,dy);//接着往八个方向搜 } } int main() { cin>>n>>m; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { cin>>a[i][j]; } } for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(a[i][j]=='W') {//找到水坑开始搜 dfs(i,j); ans++;//水坑+1 } } } cout<<ans;//输出 return 0; }