深度优先搜索——DFS

深度优先搜索简称深搜,也叫DFS,也是一种枚举,
其搜索过程类似于树结构
  

其搜索过程是A-B-F-I若无法进行,则返回F,还没有就返回到B,然后A,再从A开始,A-C-G返回.....

深搜的基本结构:
 

void dfs (int x)//x是当前状态
{   if(..完成的条件)
     //更新答案
//根据题目要求 进行设置然后判断
if(..//符合题目要求,即这一状态搜索完毕)
dfs(x+1)//转移状态
         
(.......)  //最后在某些题目中最重要的是取消当前状态的行为,方便回溯



}

由于最近的降雨,水聚集在农民约翰田地的各个地方,由N x M(1 <= N <= 100;1 <= M < = 100)正方形的矩形表示。每个方块包含水("W")或干燥的土地(".")。农民约翰想弄清楚他的田地里已经形成了多少池塘。池塘是一组连接的正方形,其中有水,其中正方形被视为与其所有八个邻居相邻。给定农夫约翰田地的图表,确定他有多少个池塘

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

            第 2 行:N+1:每行 M 个字符,表示 Farmer John 的一行字段。每个字符都是"W"或"."。字符之间没有空格。
输出: 第1行:农夫约翰田地里的池塘数量。
10 12
W   .  .  .  .  .  .  .  .  WW .
. WWW .  .   .  .  .  WWW
.  .  .  .  WW  .  .  .  WW .
.  .  .  .  .  .  .  .  .    WW  .
.  .  .  .  .  .  .  .  .  W   .   .
.  . W .  .  .  .  .  .  W   .  .
. W . W .  .  .  .  .  WW  .
W. W . W .  .  .  .  .  W   .
. W . W  .  .  .  .  .  .  W   .
. .  W .    .  .  .  .  .  .  W  .

#include<iostream>
using namespace std;
 int n,m;
char field[101][101]; //放置农田每个坐标是否积水状况
void dfs (int x,int y){  //对当前位置深搜
field [x][y]='.';  
/*将当前位置替换为‘.‘防止二次计算 ,同时也保证不会无限深搜下去(总有全替换完的时候),相当于结束的前提*/
for(int dx=-1;dx<=1;dx++) {  //根据题目对八个方向深搜
   for(int dy=-1;dy<=1;dy++)  {
    int nx=x+dx,ny=y+dy; 
    if(0<=nx&&nx<n&&0<=ny&&ny<m&&field[nx][ny]=='W')//保证在边界内
              dfs(nx,ny);  //下一状态

                   }
               }
return ;    
         }
int main (){

cin>>n>>m;
for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
    cin>>field [i][j];
    int res=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(field [i][j]=='W'){
            dfs(i,j);//从有水的地方开始
            res++;
        }
    }
}
cout<<res<<endl;

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Assault boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值