DFS hdu1241

DFS这个东西会的我感觉没什么东西,就一直搜就是了。

然后觉得百度讲的挺好的,放过来看看。

·dfs(状态)
–if  状态是目标状态 then
·dosomething
–else
·for 每个新状态
–if 新状态合法
»dfs(新状态)
·主程序:
·dfs(初始状态)
 
书上的油田例题,感觉也是求联通块问题,可以用并查集做,现在还是不怎么会用DFS这种。
例题在hdu1241  
贴个链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241
然后代码:

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<memory.h>
using namespace std;

char maps[105][105];

char visit[105][105];

int dir[8][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};

int m,n,ans;

void dfs (int x,int y)
{
int x1,y1,i;
visit[x][y]='0';
for(i=0;i<8;i++)
{
x1=x+dir[i][0];
y1=y+dir[i][1];
if(maps[x1][y1]=='@'&&visit[x1][y1]=='1'&&x1>=0&&y1>=0&&x1<m&&y1<n)
dfs(x1,y1);

}


}
int main( )
{
int i,j,ans;
while(cin>>m)
{
memset(visit,'1',sizeof(visit));

ans=0;

if(m==0)
break;
cin>>n;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>maps[i][j];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(maps[i][j]=='@'&&visit[i][j]=='1')
{
ans++;
dfs(i,j);

}
}
/*cout<<endl;
cout<<endl;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
cout<<visit[i][j];
cout<<endl;
}*/
cout <<ans<<endl;
}
return 0;
}

 

 

 

posted @ 2017-05-12 21:07  LiebeCelery  阅读(136)  评论(0编辑  收藏  举报