zoukankan      html  css  js  c++  java
  • DFS(2)——hdu1241Oil Deposits

    一、题目回顾

    题目链接:Oil Deposits

    题意:给你一块网格,网格被分为面积相等的地块,这些地块中标记'@'的是油田,标记'*'的不是油田。已知一块油田与它上下左右以及对角线的油田同属一片油区,请问总共有多少油区。

    二、解题思路

    • DFS经典
    • 注意的就是要向八个方向搜索,搜索完一处,将该处变成石头(另一种标记)
    • 答案变量在主函数内改变,而不在dfs函数内

    三、代码

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    
    int m,n,ans;
    char a[105][105];                    //存储网格 
    
    void dfs(int x,int y)
    {
        if(x<1||x>m||y<1||y>n){            //超出边界,搜索失败 
            return;
        }
        if(a[x][y] == '*'){                //不是油田,搜索失败 
            return;
        }
        if(a[x][y]=='@'){                //是油田 
            a[x][y] = '*';                //标记的另一种用法 
            //搜索它的左右上下对角线 
            dfs(x-1,y-1);dfs(x-1,y);dfs(x-1,y+1);dfs(x,y-1);dfs(x,y+1);dfs(x+1,y-1);dfs(x+1,y);dfs(x+1,y+1);
        }
    }
    
    int main()
    {
        while(scanf("%d%d",&m,&n)){
            if(m==0 && n==0)    break;
            for(int i=1;i<=m;i++){
                getchar();
                for(int j=1;j<=n;j++){
                    scanf("%c",&a[i][j]);
                }
            }
            getchar();
            ans = 0;
            for(int i=1;i<=m;i++){
                for(int j=1;j<=n;j++){
                    if(a[i][j] == '@'){
                        dfs(i,j);
                        ans++;
                    }
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    } 
    View Code
  • 相关阅读:
    Web容器初始化过程
    基于LayUI实现前端分页功能
    Ubuntu16.04首次root登录设置
    Java集合Iterator迭代器的实现
    ThreadLocal的基本原理与实现
    Redis系列四之复制
    反应堆模式
    Netty学习之客户端创建
    Netty学习之服务器端创建
    Java NIO服务器端开发
  • 原文地址:https://www.cnblogs.com/xzxl/p/7306524.html
Copyright © 2011-2022 走看看