1249:Lake Counting
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
题意:有一块N×M的土地,雨后积起了水,有水标记为‘W’,干燥为‘.’。八连通的积水被认为是连接在一起的。请求出院子里共有多少水洼?
【输入】
第一行为N,M(1≤N,M≤110)。
下面为N*M的土地示意图。
【输出】
一行,共有的水洼数。
【输入样例】
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 <iostream> #include <cstdio> #include <cstring> using namespace std; int x[8]={-1,-1,-1,0,1,1,1,0}; int y[8]={-1,0,1,1,1,0,-1,-1}; int n,m,td[112][112],que[1100][4]; int tj=0; void bfs(int a,int b){ tj++; int x1,y1,to=0,w=1; memset(que,0,sizeof(que)); que[1][1]=a,que[1][2]=b,que[1][3]=0;td[a][b]=0; do{ to++; for(int k=0;k<8;k++){ x1=que[to][1]+x[k]; y1=que[to][2]+y[k]; if(x1>0&&x1<=n&&y1>0&&y1<=m&&td[x1][y1]==1){ w++; que[w][1]=x1;que[w][2]=y1;que[w][3]=que[to][3]+1; td[x1][y1]=0; } } }while(w>to); } int main(int argc, char *argv[]) { scanf("%d %d",&n,&m); char t; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ cin>>t; if(t=='W')td[i][j]=1; else td[i][j]=0; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(td[i][j]==1) bfs(i,j); } printf("%d\n",tj); return 0; }