【ACM之路】7.搜索算法 - 深度优先搜索DFS

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;

}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值