【C++】利用DFS求解水洼数目问题

题目描述

  • 有一个大小为N x M的园子,雨后积了很多水。 八连通的积水被认为是连接在一起的。(八连通指的是下图中相对。的W部分)
  • 请求出园子里总共有多少个水洼?

八连通的水洼如下所示:
W W W
W 。 W
W W W

题目意思是:。的附近八个位置(上、下、左、右、左上、右上、左下、右下)的W是连在一起的,如此,这八个W可以看成是一个水洼。
如下图,则有2个水洼,其中,前三行的W为一个,后两行的W为一个。

输入

N=5,M=5

在这里插入图片描述

输出

2

思路

  • 利用dfs进行深度遍历,遇到有水"w",则把水“抽掉”,将"w"变为"."

代码

#include
#include
#include
using namespace std;

int num=0;
int N,M;

/*
若定义为void dfs(vector A,int i,int j);
则最终得到的结果是11,即W的个数,而非想要的水洼数目
vector与数组不同点是,这样传递的只是数值,而非数组的引用。
不会改变vector数组的值
*/
void dfs(vector &A,int i,int j)
{
	int k,q;
	
	//将自己变成一个'.'
	A[i][j] = '.';
	
	//遍历其周围八个点
	for(k=i-1;k=0&&k=0&&q

运行结果

【C++】利用DFS求解水洼数目问题_第1张图片

遇到的问题

  • 在使用vector时,最开始定义的函数头为
void dfs(vector<string> A,int i,int j)

在执行程序后,得到的结果是sum=11,刚好与W的个数相同。
经查阅相关博客C++ 函数vector传参发现,vector数组与普通数组存在着一些不同之处。
vector与数组的其中一个不同点是,vector A 传递的只是数值,而非数组的引用。因此,利用vector &A,对A中的数值进行改变。

你可能感兴趣的:(深度优先,c++,算法)