2520: 【普及-】【P1596】Lake Counting S
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:12
解决:6
题目描述
由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 的网格图表示。每个网格中有水(W
) 或是旱地(.
)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,确定当中有多少水坑。
输入
输入第 行:两个空格隔开的整数: 和 。
第 行到第 行:每行 个字符,每个字符是 W
或 .
,它们表示网格图中的一排。字符之间没有空格。
输出
输出一行,表示水坑的数量。
样例输入 复制
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
样例输出 复制
3
提示
#include<bits/stdc++.h> using namespace std; struct point{ int x,y; }; int n,m,ans=0,dx[8]={0,-1,-1,-1,0,1,1,1},dy[8]={-1,-1,0,1,1,1,0,-1}; char land[105][105]; bool mark[105][105]={0}; queue<point> q; int main(){ cin>>n>>m; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>land[i][j]; } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(land[i][j]=='W'&&mark[i][j]==0) { ans++; mark[i][j]=1; //bfs q.push(point{i,j}); while(!q.empty()) { point p=q.front(); q.pop(); for(int k=0;k<8;k++) { int x=p.x+dx[k],y=p.y+dy[k]; if (x<0||y<0) continue; if (land[x][y]=='W'&&mark[x][y]==0) { mark[x][y]=1; q.push(point{x,y}); } } } } } } cout<<ans; return 0; }
#include<bits/stdc++.h> using namespace std; int n,m,ans=0,dx[8]={0,-1,-1,-1,0,1,1,1},dy[8]={-1,-1,0,1,1,1,0,-1}; char land[105][105]; bool mark[105][105]={0}; void dfs(int x,int y) { for(int i=0;i<8;i++) { int tx=x+dx[i],ty=y+dy[i]; if(land[tx][ty]=='W'&&mark[tx][ty]==0) { mark[tx][ty]=1; dfs(tx,ty); } } } int main(){ cin>>n>>m; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>land[i][j]; } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(land[i][j]=='W'&&mark[i][j]==0) { ans++; mark[i][j]=1; dfs(i,j); } } } cout<<ans; return 0; }