Oil Deposits(油田问题)

题意:找出地图上的油层数,每个油层由多个油藏组成,这些油藏相邻,常规的搜索问题,每次向八个方向搜寻油藏。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241

友情链接:点这里

    此处为DFS代码:

#include<stdio.h>
#include<queue>
#include<iostream>
#include<string.h>
using namespace std;
int m,n;
char mp[105][105];
void dfs(int a,int b)
{
    mp[a][b]='*';//找到了油田就把它改成*避免重复查找 
    for(int dx=-1;dx<=1;dx++)
    {
        for(int dy=-1;dy<=1;dy++)
        {
            int nx=a+dx;
            int ny=b+dy;
            if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&mp[nx][ny]=='@')
            dfs(nx,ny);//最关键的地方,递归找到的新油田。 
        }
    }
}
int main(void)
{
    while(cin>>m>>n&&m&&n)//这里当m和m为0的时候就退出循环 
    {
        int sum=0;//每次初始化sum为0。 
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                cin>>mp[i][j];
            }
        }
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(mp[i][j]=='@')
                {
                    dfs(i,j);
                    sum++;//每找到一个油藏sum就++。 
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

当然这种题用bfs也可以,只是觉得DFS写着简便易懂一点,bfs就不详细论述了,毕竟我这题用bfs做ML了好几次,,,,

#include<iostream>
#include<queue>
#include<stdio.h>
#include<string.h>
#define N 100
using namespace std;
int r,c,ans;
char mp[N][N];
bool vis[N][N]; 
int fx[8]={1,0,-1,0,-1,1,-1,1};
int fy[8]={0,1,0,-1,-1,-1,1,1};
struct node
{
    int x,y;
};

bool check(int x,int y)
{
    if(!vis[x][y] && mp[x][y]=='@' && x>=0 && x<r && y>=0 && y<c )
        return 1;
    return 0;
}

void bfs(int x,int y)
{
    queue<node> q;
    q.push({x,y});
    while(q.size())
    {
        node now=q.front();
        q.pop();
        for(int i=0;i<8;i++)
        {
            int nextx=now.x + fx[i];
            int nexty=now.y + fy[i];
            if(check(nextx,nexty))
            {
                vis[nextx][nexty]=1;
                q.push({nextx,nexty});
            }
        }
    }
    return ;
 } 

int main()
{
    ios_base::sync_with_stdio;
    while(cin>>r>>c && r)
    {
        ans=0;
        memset(vis,0,sizeof vis);
        memset(mp,0,sizeof mp);
        for(int i=0;i<r;i++)
        {
            for(int j=0;j<c;j++)
            {
                cin>>mp[i][j];
            }
        }
        for(int i=0;i<r;i++)
        {
            for(int j=0;j<c;j++)
            {
                if(mp[i][j]=='@' && !vis[i][j])
                {
                    bfs(i,j);
                    ans++;
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

小结一下:此题推荐使用深搜,每次搜索都能将一片油藏搜索出来,不过这两种算法最好都要掌握。

猜你喜欢

转载自www.cnblogs.com/YHH520/p/12229546.html