dfs理解1
dfs为深度搜索,我的理解是一条路走到黑(不撞南墙不回头),其实和函数的递归一样,当然可以用栈来实现,但一般用函数的递归来实现。
个人感觉和二叉树的前序遍历有点像,就是一个一个的排查路并去除不符合规定的路。
但是和bfs不同,bfs是一层一层的遍历,就相当于在清水中滴入一滴墨水一样。从中心向四周扩散
这几天学习了一点dfs,说一下我的理解。
1:dfs感觉是运用在求联通问题和能走的最大步数的问题上(其他的我还没学到)
1:联通问题
例如:
这类的题目,一般就是求联通的数量,有的题目联通的方式不同,有的是上下左右,有的还可以对角线走。原理都相同
解题思路:找到一个@后用dfs搜索并在计数器上加一,这里要注意搜索的过程中要将已经搜索过的要变成*这里要防止第二次的访问,然后就是编写dfs函数,因为是递归函数,所以要编写递归推出的条件(很重要),然后就是让它进行dfs深度搜索,也就是递归,同时这里要注意,编写的是带返回值的函数,还是不带的,这里我老错,如果是带返回值的函数,就一定不要忘记返回值,因为有时候要根据返回值结束递归(有的题目可呢超时)
下面附上我的代码:
#include <iostream>
using namespace std;
const int maxn=105;
char field[maxn][maxn];
int cnt,m,n;
void dfs(int x,int y)
{
field[x][y]='*';
for(int i=-1; i<2; i++)
for(int j=-1; j<2; j++)
{
int xx=x+i;
int yy=y+j;
if(xx>=0&&yy>=0&&xx<m&&yy<n&&field[xx][yy]=='@')
dfs(xx,yy);
}
}
int main()
{
while(cin>>m>>n)
{
if(m==0&&n==0)break;
cnt=0;
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
cin>>field[i][j];
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
if(field[i][j]=='@')
{
dfs(i,j);
cnt++;
}
cout<<cnt<<"\n";
}
return 0;
}
如果我有理解错的,请指出,谢谢