搜索—Problem_1011-Oil Deposits

搜索—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;  
} 

你可能感兴趣的:(搜索)