【C++】DFS——计算土地上水洼的数量

tech2022-09-08  119

题目大意:一场大雨后,在一片土地上出现若干水洼,现在把这片土地看成一个mxn的二维方块矩阵,其中有水的方块用'W'表示,陆地用'H'表示。现在由陆地方块或者边界围成的有水方块视为一个水洼(单个有水方块也算),且只有水平或垂直方向连续的含水方块才能视为属于同一个水洼(斜着的不行),请计算这片土地上有多少个水洼。

输入:第一行两个整数m和n,接下来m行连续的字符串,长度均为n,表示mxn的土地矩阵,每个字符只能为'W'或'H'。

输出:一个整数,表示水洼的数量。

思路:遍历二维数组,每次找到一个'W'时水洼数量加一,然后将这个方块修改为'H',并对其上下左右四个方向dfs搜索,把所有可能连续的'W‘方块全修改为’H‘,注意判断数组边界。

代码

#include<iostream> #include<cstring> using namespace std; char a[1001][1001]; int m,n; void dfs(int i,int j){ if(a[i][j]!='W') return; else{ a[i][j]='H'; if(i-1>=0&&i-1<m&&j>=0&&j<n) dfs(i-1,j); if(j-1>=0&&j-1<n&&i>=0&&i<m) dfs(i,j-1); if(j+1<n&&j+1>=0&&i>=0&&i<m) dfs(i,j+1); if(i+1<m&&i+1>=0&&j>=0&&j<n) dfs(i+1,j); } } int main(){ cin>>m>>n; int i,j; cin.get(); for(i=0;i<m;i++){ for(j=0;j<n;j++){ cin>>a[i][j]; } } int count=0; for(i=0;i<m;i++){ for(j=0;j<n;j++){ if(a[i][j]=='W'){ dfs(i,j);count++; } } } cout<<count<<endl; return 0; }

运行结果

 

最新回复(0)