题解 | #Lake Counting#
Lake Counting
https://ac.nowcoder.com/acm/problem/24739
#include<bits/stdc++.h> using namespace std; const int N=1e2+10; char mp[N][N];//定义地图 int n,m; typedef pair<int,int>PII; int move_[8][2]={{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1}};//移动变量 void bfs(int a,int b)//广搜,将传进来的池塘变‘.’ { queue<PII>q;//坐标队列 q.push({a,b}); while(!q.empty()) { int x=q.front().first;//读坐标 int y=q.front().second; q.pop(); mp[x][y]='.';//初始化第一个点(可以放上面,这里偷个懒) for(int i=0;i<8;i++) { int dx=x+move_[i][0];//移动后的坐标 int dy=y+move_[i][1]; if(dx<=n&&dx>0&&dy<=m&&dy>0&&mp[dx][dy]=='W')//查找正方形边上是否有‘W’ { mp[dx][dy]='.'; q.push({dx,dy}); } } } } int main() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>mp[i][j]; int ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(mp[i][j]=='W'){bfs(i,j);ans++;}//统计池塘 } cout<<ans; return 0; }