• 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;
    }

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

  • 相关阅读:
    利用Openssh后门 劫持root密码
    CentOS 6.9 升级OpenSSH版本 关闭ssh服务后门
    CentOS 7 实现zabbix agent 自动添加,并链接到指定的模版
    CentOS 7 zabbix添加监控服务器
    CentOS 7 Squid代理服务器反向代理
    CentOS 7 Squid代理服务器正向代理-透明代理
    CentOS 7 Squid代理服务器正向代理-传统代理
    CentOS 7 搭建Squid代理服务器
    CentOS 7 配置DHCP中继代理服务
    CentOS 7 配置DHCP
  • 原文地址:https://www.cnblogs.com/Mangata/p/12229546.html
Copyright © 2020-2023  润新知