有一个大小为n*m的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通指的是下图中相对w的*的部分)
***
*w*
***
限制条件:n,m<=100
思路:
1.遍历整个园子。遇到w就进行dfs,同时水坑数+1
2.dfs函数:
1)把w变成”.“。
2)遍历四个方向,寻找符合的方向(不超出边界,该位置是“w"),把符合的方向的坐标作为递归的参数
3)递归dfs函数
#include<iostream>
using namespace std;
char field [20][25]; // 园子
// 现在位置(x,y)
int M,N;
void dfs(int x,int y)
{
//将现在的位置替换为 .
field[x][y]='.';
// 循环遍历一定的八个方向
for(int dx=-1;dx<=1;dx++)
for(int dy=-1;dy<=1;dy++)
{
// 向x的方向移动dx 向y的方向移动dy 移动的结果为 (nx,ny)
int nx = x +dx,ny = y+dy;
//判断(nx,ny)是否在园子内 以及是否有积水
if(0<=nx && nx< N && 0<=ny && ny < M && field[nx][ny]=='W')
dfs(nx,ny);
}
return ;
}
int main()
{
cin >> M >> N ;
int res = 0;
for(int i=0;i<M;i++)
for(int j=0;j<N;j++)
{
cin >> field[i][j] ;
if(field[i][j] == 'W'){
//从有W的地方开始dfs
dfs(i,j);
res++;
}
}
}
Lake Counting(POJ NO.2386)
最新推荐文章于 2021-12-12 11:14:51 发布