搜索——油田合并

先抛出一个题目:

某石油公司发现了一个油田。该油田由n*m个单元组成的矩形,有些单元里有石油,有些则没有。
单元油田可以通过上,下,左或右连通。在一个单元油田里架设一台采油机,它可以把和该单元
油田相连的单元油田的石油采完。该公司想知道最少需要架设几台采油机能把所有的石油采完?
示例输入:
2 2
@*
*@
2 2
@@
@@
示例输出:
2
1


讲dfs时的第一题,也是特别容易联想到的搜索逻辑。针对于每一个点,都有四种扩展分支

即:当前坐标{-1,0},{0,1},{1,0},{0,-1},然后逐渐深入查找


#include<stdio.h>
char map[101][101];
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int n,m,num;
int dfs(int x,int y)
{
     int a,b,k;
     map[x][y]='*';  
     for(k=0;k<8;++k)
     {
          a=x+dir[k][0];
          b=y+dir[k][1];
          if(a<n&&a>=0&&b<m&&b>=0&&map[a][b]=='@')
          dfs(a,b);
     }
     return 1; 
}
int main()
{
    int i,j;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0) break;
        num=0;
        for(i=0;i<n;++i)
            scanf("%s",&map[i]);
        for(i=0;i<n;++i)
           for(j=0;j<m;++j)
               if(map[i][j]=='@')
                   num+=dfs(i,j);
        printf("%d\n",num);
    }
    return 0; 
}

深搜的框架并不难,难点在于剪枝的处理,针对于不同题目不同的要求,如何保证搜索的效率使程序不做无用功的搜索是搜索算法的核心。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值