问题 : Oil Deposits(油田) DFS经典例题 再此使用递归求解

题目描述

由于最近下雨,水已集中在Farmer John田野的不同地方,由N×M(1 <= N <= 100; 1 <= M <= 100)个正方形的矩形表示。每个广场包含水('W')或旱地('。')。农夫约翰想弄清楚他的田地里有多少个池塘。一个池塘与其中的水相连,其中一个广场被认为与所有八个邻居相邻。 


根据Farmer John的领域图,确定他有多少个池塘。

输入

*第1行:两个空格分隔的整数:N和M  

*第2..N + 1行:每行代表农夫约翰田地的一行的M个字符。每个字符都是'W'或'。'。角色之间没有空格。

输出

* 1号线:约翰农场的池塘数量。

样例输入

5 5
....W
.WW.W
.W..W
WWW.W
WW..W

样例输出

2
#include <iostream>
int M,N;
using namespace std;
void find(char a[100][100],int n,int m)//判断该处是否为一个油田 
{ 
	if(a[n][m]=='.'||n<0||m<0||m>M-1||n>N-1) return;//如果该处已经被采集 将其变为石头 
	a[n][m]='.'; //采集该处 
    find(a,n-1,m-1);//向八个方向进行搜索 
	find(a,n-1,m);
	find(a,n-1,m+1);
	find(a,n,m-1);
	find(a,n,m+1);
	find(a,n+1,m-1);
	find(a,n+1,m);
	find(a,n+1,m+1);
	return;
}
int main()
{
	int i,j,count=0;
	cin>>N>>M;
	
	char a[100][100]={0};//传入油田 
	for(i=0;i<N;i++)
        for(j=0;j<M;j++)
	    	cin>>a[i][j];

	for(i=0;i<N;i++)//找油田有多少块 
	    for(j=0;j<M;j++)
	    {
	    	if(a[i][j]=='W')
	    	{
	    		find(a,i,j);
	    		count++;
			}
		}
	cout<<count<<endl; 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41486817/article/details/80617237