DFS基本模板
int check(参数)
{
if(满足条件)
return 1;
return 0;
}
void dfs(int step)
{
判断边界
{
相应操作
}
尝试每一种可能
{
满足check条件
标记
继续下一步dfs(step+1)
恢复初始状态(回溯的时候要用到)
}
}
例子:油田问题
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int vis[110][110],m,n;
char res[110][110];
int check(int dx,int dy,int sum)//check函数用于判断是否满足条件
{
if(dx!=0||dy!=0)//满足返回1;
{
return 1;
}
return 0;//否则返回0;
}
void dfs(int x,int y,int sum)
{
if(x<0||y<0||x>=m||y>=n)
{
return;
}
if(res[x][y]!='@')
return;
res[x][y]='.';
for(int dx=-1;dx<=1;dx++)
{
for(int dy=-1;dy<=1;dy++)
{
if(check(dx,dy,sum))
{
dfs(x+dx,y+dy,sum);
}
}
}
}
int main()
{
while(scanf("%d %d",&m,&n)&&m&&n)
{
memset(vis,0,sizeof(vis));
memset(res,'0',sizeof(res));
int i,j,sum=0;
for(i=0;i<m;i++)
{
getchar();
for(j=0;j<n;j++)
{
scanf("%c",&res[i][j]);
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(res[i][j]=='@')
{
dfs(i,j,++sum);
}
}
}
printf("结果是:%d\n",sum);
}
return 0;
}