搜索—Problem_1011-Oil Deposits

15 篇文章 0 订阅

搜索—Problem_1011-Oil Deposits
题意
搜索石油块问题。题目说明,@代表有石油,*代表没有石油,而在一个有石油的地方它的周围8个方向的地方如果也有石油,那么这2块则石油是属于一块。,给出图,问图中有几块石油田。
解题思路
使用DFS搜索,首先搜索图中第一个出现@的位置,然后对其8个方向进行搜索,并对搜索过的为@进行标记,直到一次搜索结束则油田总数加一,最后的总数即为所求的石油的方块数。
感想
上课时讲过的例题,作为DFS的基础题目,从而了解到这一类题目的做法,虽然有些复杂,但基本的搜索策略是大致相同的。
AC代码

#include <iostream>
#include <cstring>    
using namespace std;

bool visit[110][110]; //重复访问控制   
char maze[110][110];  //地图   
int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};//八个方向   
int sum,m,n,sx,sy; 
//判断边界   
bool isbound(int a,int b)
{  
    if(a<1 || a>m || b<1 || b>n)return true; 
    return false; 
} 
//对每一个点进行深搜  
void dfs(int sx,int sy)
{        
    for(int i=0;i<8;i++) 
    { 
        if(maze[sx+dir[i][0]][sy+dir[i][1]]=='*')continue;//障碍返回   
        if(isbound(sx+dir[i][0],sy+dir[i][1]))continue;//边界返回   
        if(visit[sx+dir[i][0]][sy+dir[i][1]])continue;//已访问,返回   
        visit[sx+dir[i][0]][sy+dir[i][1]]=1; //标记已访问,防止重复访问   
        dfs(sx+dir[i][0],sy+dir[i][1]); 
    } 
} 

int main() 
{ 
    while(cin>>m>>n) 
    { 
        if(m==0) break; 
        memset(visit,0,sizeof(visit)); 
        for(int i=1;i<=m;i++)
        { 
            for(int j=1;j<=n;j++)
            { 
                cin>>maze[i][j]; 
            } 
        } 
        sum=0; 
        for(int i=1;i<=m;i++)
        {         
            for(int j=1;j<=n;j++)
            { 
                if(maze[i][j]=='@'&& !visit[i][j])
                {
                    visit[i][j]=1; 
                    dfs(i,j);
                    sum++;
                }
            } 
        } 
        cout<<sum<<endl;      
    }  
    return 0;  
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值