DFS

有一个大小为N*M的园子,雨后积水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼?(八连通指的是下图中相对W的A部分)
A A A
A W A
A A A
样例输入N=10,M=12,园子如下:
w........ww.
.www....www
....ww...ww.
.........ww.
.........w..
..w......w..
.w.w.....ww.
w.w.w.....w
.w.w......w.
..w.......w.
输出 3
   从任意w开始,不停把邻接部分用’.’代替。一次DFS后与初始的这个w连接的所有w就都被替换成了’.’,因此直到图中不再存在w为止,总共进行DFS的次数就是答案了。八个方向共对应了8种状态转移,每个格子DFS参数至多被调用一次。
#include<stdio.h>
#include<iostream>
using namespace std;
char field[100][100];
int N,M;
void DFS(int x,int y)
{   
     field[x][y]='.';      //将现在的位置替换成 '.' 
	 int dx,dy,a,b; 
	 for(dx=-1;dx<=1;dx++) 
	 { 
	   for(dy=-1;dy<=1;dy++)  
	    {         
		   a=x+dx;        
		   b=y+dy;   
	    	if((a>=0 &&a<=N)&&(b>=0&&b<=M)&&field[a][b]=='W')     
		   DFS(a,b);   
		}   
	}    
	return ;
}
   int main()
   {   
    cout<<"请输入园子的N(行) 和 M(列):"; 
	 cin>>N>>M; 
	 cout<<"请输入园子内积水和陆地状态:"<<endl; 
	  for(int i=0;i<N;i++) 
	  {  
	    for(int j=0;j<M;j++)  
		  {    
		    cin>>field[i][j];  
		  }   
		  cout<<endl;
	   }     
	   
	   int count=0;  
	   for(int i=0;i<N;i++) 
	    {   
		  for(int j=0;j<M;j++)   
		  {   
		   if(field[i][j]=='W')   
		    {     DFS(i,j);   //从有‘w'的地方进行 DFS      
			count++;        
			}   
		  }  
		 }    
		 
		 cout<<count;   
		 
		return 0;
	}
/*
输入 
10 12 
W........WW. 
.WWW.....WWW 
....WW...WW. 
.........WW. 
.........W.. 
..W......W.. 
.W.W.....WW. 
W.W.W.....W. 
.W.W......W. 
..W.......W. 
输出 
3*/ 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值