深度优先搜索简称深搜,也叫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;
}