有一个大小为N*M的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里一共有多少水洼?(八连通指的是下图相对W的*部分)
* * *
*W*
* * *
限制条件:
N,M<=100
样例:
输入:
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>
using namespace std ;
int main()
{
int h,l;
cin>>h>>l;
int gra[h][l];
int i,j,k,v,m;
for(i=0;i<h;i++)
for(j=0;j<l;j++)
gra[i][j]=0;
for(i=0;i<h;i++)
{
cin>>k>>v;
k--;
for(j=0;j<v;j++)
{
cin>>m;
m--;
gra[k][m]=1;
}
}
for(i=0;i<h;i++)
{
for(j=0;j<l;j++)
{
if(j) cout<<" ";
cout<<gra[i][j];
}
cout<<endl;
}
}
这道题可以用BFS 和 DFS实现,
下面给出DFS 的实现方法:
#include<iostream>
using namespace std ;
int N,M;
char a[100][100];
void dfs(int x,int y)
{
int dx,dy,nx,ny;
a[x][y]='.';
for(dx=-1;dx<=1;dx++)
for(dy=-1;dy<=1;dy++)
{
nx=x+dx;
ny=y+dy;
if(nx>=0&&nx<N&&ny>=0&&ny<M&&a[nx][ny]=='W')
dfs(nx,ny);
}
}
int main()
{
int i,j,c;
c=0;
cin>>N>>M;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
cin>>a[i][j];
for(i=0;i<N;i++)
for(j=0;j<M;j++)
{
if(a[i][j]=='W')
{
dfs(i,j);
c++; }
}
cout<<endl<<"c"<<c<<' ';
return 0;
}