题目描述
输入

输出
思路
- 利用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;
}
运行结果

遇到的问题
void dfs(vector<string> A,int i,int j)