欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

dfs学习笔记整理

程序员文章站 2022-03-30 13:48:01
...

一边学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;
}

相关标签: dfs