HDU 1241 -- Oil Deposits (dfs)

题目大意:有一块m*n油田,’@‘认为是有油,’*‘认为没油,如果有多块油田连着,则被统一认为为一块油田,一块油田可以有上,下,左,右,左上,右上,左下,右下8个方位,问一共有多少块油田。

思路分析:从(0,0)点开始找,遇到一个油田’@‘,调用dfs函数,搜索以这个点为根节点的一整棵树,并把这个过程中的被找到的结点对应的油田的位置设为’*‘,即没油,保证这个点只被访问一次。一直找到(m-1,n-1)调用了多少次dfs,就说明有多少个油田,在此计数就可以了。

#include<stdio.h>
#include<string.h>
const int maxn=110;
char oil[maxn][maxn];
int dir[8][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
int m,n,count;
void dfs(int x,int y){
    if(oil[x][y]=='*'||x<0||x>=m||y<0||y>=n)
        return;
    oil[x][y]='*';
    for(int i=0;i<8;i++){
        dfs(x+dir[i][0],y+dir[i][1]);
    }
}
int main(){
    while(~scanf("%d%d",&m,&n),m){
        count=0;
        for(int i=0;i<m;i++){
           scanf("%s",oil[i]);
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(oil[i][j]=='@'){
                    dfs(i,j);
                    count++;
                }
            }
        }
        printf("%d\n",count);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值