有一个大小为N*M的园子,雨后积水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通指的是下图中相对W的A部分)
A A A
A W A
A A A
样例输入N=10,M=12,园子如下:
A A A
A W A
A A A
样例输入N=10,M=12,园子如下:
w........ww.
.www....www
....ww...ww.
.........ww.
.........w..
..w......w..
.w.w.....ww.
w.w.w.....w
.w.w......w.
..w.......w.
.www....www
....ww...ww.
.........ww.
.........w..
..w......w..
.w.w.....ww.
w.w.w.....w
.w.w......w.
..w.......w.
输出 3 从任意w开始,不停把邻接部分用’.’代替。一次DFS后与初始的这个w连接的所有w就都被替换成了’.’,因此直到图中不再存在w为止,总共进行DFS的次数就是答案了。八个方向共对应了8种状态转移,每个格子DFS参数至多被调用一次。
#include<stdio.h>
#include<iostream>
using namespace std;
char field[100][100];
int N,M;
void DFS(int x,int y)
{
field[x][y]='.'; //将现在的位置替换成 '.'
int dx,dy,a,b;
for(dx=-1;dx<=1;dx++)
{
for(dy=-1;dy<=1;dy++)
{
a=x+dx;
b=y+dy;
if((a>=0 &&a<=N)&&(b>=0&&b<=M)&&field[a][b]=='W')
DFS(a,b);
}
}
return ;
}
int main()
{
cout<<"请输入园子的N(行) 和 M(列):";
cin>>N>>M;
cout<<"请输入园子内积水和陆地状态:"<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
cin>>field[i][j];
}
cout<<endl;
}
int count=0;
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
if(field[i][j]=='W')
{ DFS(i,j); //从有‘w'的地方进行 DFS
count++;
}
}
}
cout<<count;
return 0;
}
/*
输入
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*/