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;
}