dfs学习笔记整理

一边学dfs,一边整理啦
dfs题型
1.连通块: 就是标记画图,算出每个小模块个数
2.寻找到达终点的途径数:理解dfs其实会无数次到达终点后,每次到达就ans++就可以算出,但是注意回溯时vis[x][y]]要清0. 例如下面这个

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=102;
char chess[maxn][maxn];
int dirx[]={0,-1,0,1,0};
int diry[]={0,0,-1,0,1};
bool vis[maxn][maxn];
int r,c,sum=0;
bool dfs(int x,int y)
{if(chess[x][y]=='e')sum++;
    vis[x][y]=1;
int yes=0;
    for(int i=1;i<=4;i++)
    {
        int nx=x+dirx[i];
        int ny=y+diry[i];
        if(nx<1||nx>r||ny<1||ny>c)continue;
        if(chess[nx][ny]!='#'&&vis[nx][ny]==0)dfs(nx,ny);
    }
    vis[x][y]=0;

}
int main(void)
{scanf("%d %d",&r,&c);
getchar();
int i,d,bx,by;
for(i=1;i<=r;i++)
  {
    for(d=1;d<=c;d++)
{
    chess[i][d]=getchar();
  if(chess[i][d]=='s'){bx=i;by=d;}
}
getchar();}
dfs(bx,by);
cout<<sum<<endl;
return 0;
}

3.从n个数中选择k个数的和为sum。
方法一:每次dfs2种选择,选和不选
方法二:思想是从剩下里的选,因此选过的要做标记,像做素数环的题目一样。

猜你喜欢

转载自blog.csdn.net/qq_43235540/article/details/86574812