1.简介:
深度优先是尽可能先向深的地方搜索,若搜索不到,则回退一步向其他方向搜索,如若不能继续回退,直到搜索完毕。
2.例题1(NYOJ27 水池问题,判断水池个数)
南阳理工学院有许多水池,设为1,陆地设为0,判断有几个水池,注意一个水池的上下左右若也是水池则只算一个。
比如:
1 1 0 0 0
0 1 0 0 1
0 0 0 1 0 , 算三个水池。
思 路:先初始化水池为0,然后依次输入水池信息。接着开始搜索,
for(int i= 1,i < = 行数 ; i ++)
for( int j=1 , j < = 列数; j ++) ,判断map数组是否为1,若为1,则对水池数量计数,并且将该点置为0,(以防一会深搜时再次选择),而且对该点深搜。搜索完毕再对其他点进行搜索。
-----------------------------
这里在简单说一下深搜:
本题是对上下左右四个方向进行搜索,若找到一个点,则对该点置0,然后以该点为根再次进行搜索。,
#include <stdio.h>
#define N 105
#define M 105
int map[N][M];
void search(int i,int j)
{
if(map[i-1][j]){map[i-1][j]=0;search(i-1,j);}
if(map[i+1][j]){map[i+1][j]=0;search(i+1,j);}
if(map[i][j-1]){map[i][j-1]=0;search(i,j-1);}
if(map[i][j+1]){map[i][j+1]=0;search(i,j+1);}
}
int main()
{
int i,j;
int n,m;
int t;
int count = 0;
scanf("%d",&t);
while(t--)
{
//Initialize
count = 0;
//Input data
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
}
//Process
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(map[i][j])
{
count++;
map[i][j] = 0;
search(i,j);
}
}
//Output
printf("%d\n",count);
}
return 0;
}
博客介绍了深度优先搜索,即尽可能向深的地方搜索,搜索不到则回退。并通过NYOJ27水池问题为例,给出判断水池个数的思路,先初始化水池信息,遍历数组,若为水池则计数并置0,再对该点进行上下左右四个方向的深搜。
316

被折叠的 条评论
为什么被折叠?



