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
  • 相关阅读:
    [NOI2021] 路径交点
    CF1188D Make Equal
    CF1349F1 Slime and Sequences
    CF1067D Computer Game
    Dcat Admin安装
    PHP 中提示undefined index如何解决(多种方法)
    Git 常用命令大全
    项目维护环境部署
    bootstrap-table
    bootstrap-datetimepicker
  • 原文地址:https://www.cnblogs.com/xzxl/p/7306524.html
Copyright © 2011-2022 走看看