0
点赞
收藏
分享

微信扫一扫

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

狐沐说 2022-03-18 阅读 60

题目描述

输入

在这里插入图片描述

输出

思路

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

代码

#include<iostream>
#include<vector>
#include<string>
using namespace std;

int num=0;
int N,M;

/*
若定义为void dfs(vector<string> A,int i,int j);
则最终得到的结果是11,即W的个数,而非想要的水洼数目
vector与数组不同点是,这样传递的只是数值,而非数组的引用。
不会改变vector数组的值
*/
void dfs(vector<string> &A,int i,int j)
{
	int k,q;
	
	//将自己变成一个'.'
	A[i][j] = '.';
	
	//遍历其周围八个点
	for(k=i-1;k<i+2;k++)
		for(q=j-1;q<j+2;q++)
		{
			//跳过自己
			if(k==i&&q==j) continue;
			
			//下标不能越界!
			if(k>=0&&k<N&&q>=0&&q<M)
				if(A[k][q]=='W')
					dfs(A,k,q);//清除一个水洼	
		}

}

int main()
{
	cout<<"N=";
	cin>>N;
	cout<<"M=";
	cin>>M;
	string str;
	int i,j;
	//以字符串的形式输入
	vector<string> A;
	for(i=0;i<N;i++)
	{
		cin>>str;
		A.push_back(str);
	}
	
	for(i=0;i<N;i++)
		for(j=0;j<M;j++)
		{
			//先找到一个小水洼
			if(A[i][j]=='W')
			{
				//进入dfs处理小水洼及与其相互连通的水洼
				dfs(A,i,j);
				//处理完成后,水洼数增一
				num++;
			}
				
		}
		cout<<num<<endl;
	system("pause");
	return 0;
}

运行结果

运行结果

遇到的问题

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

相关推荐

0 条评论