zoukankan      html  css  js  c++  java
  • HDU1241 POJ1562 UVa572 UVALive5317 Oil Deposits【DFS】

    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 17768   Accepted: 9440

    Description

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots. It then analyzes each plot separately, using sensing equipment to determine whether or not the plot contains oil. A plot containing oil is called a pocket. If two pockets are adjacent, then they are part of the same oil deposit. Oil deposits can be quite large and may contain numerous pockets. Your job is to determine how many different oil deposits are contained in a grid.

    Input

    The input contains one or more grids. Each grid begins with a line containing m and n, the number of rows and columns in the grid, separated by a single space. If m = 0 it signals the end of the input; otherwise 1 <= m <= 100 and 1 <= n <= 100. Following this are m lines of n characters each (not counting the end-of-line characters). Each character corresponds to one plot, and is either `*', representing the absence of oil, or `@', representing an oil pocket. 

    Output

    are adjacent horizontally, vertically, or diagonally. An oil deposit will not contain more than 100 pockets.

    Sample Input

    1 1
    *
    3 5
    *@*@*
    **@**
    *@*@*
    1 8
    @@****@*
    5 5 
    ****@
    *@@*@
    *@**@
    @@@*@
    @@**@
    0 0

    Sample Output

    0
    1
    2
    2
    

    Source



    Regionals 1997 >> North America - Mid-Central USA


    问题链接HDU1241 POJ1562 UVa572 UVALive5317 Oil Deposits

    问题描述参见上文。

    问题分析

    本题可以使用深度优先搜索求解。本题用广度优先搜索也可以求解,差别不大。

    这个程序说明如下:

    1.方向数组 使用方向数组后,各个方向的试探的程序就会变得简洁了,用循环处理即可。

    2.避免重复搜索 将搜索过的节点设置为“*”(荒地,非油田),可以避免重复搜索,能够简化程序逻辑。

    3.设置边界 通过设置边界,可以免去矩阵(二维数组)的边界判断,简化了程序逻辑。

    该问题与图遍历中寻找联通块问题基本上是同构的,算法思路一致。

    程序说明

    每当找到一个油田,只需要计数加一,并且使用DFS算法把与其相邻的8个油田擦除即可(避免重复计数)。

    与网上许多程序相比,这个程序要简洁一些。



    AC的C语言程序如下:

    /* HDU1241 POJ1562 UVa572 UVALive5317 Oil Deposits */
    
    #include <stdio.h>
    #include <memory.h>
    
    #define DIRECTSIZE 8
    
    struct direct {
        int drow;
        int dcol;
    } direct[DIRECTSIZE] =
        {{0, -1}, {0, 1}, {-1, 0}, {1, 0}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
    
    #define MAXN 100
    
    char grid[MAXN+2][MAXN+2];
    
    void dfs(int row, int col)
    {
        int i;
    
        for(i=0; i<DIRECTSIZE; i++) {
            int nextrow = row + direct[i].drow;
            int nextcol = col + direct[i].dcol;
    
            if(grid[nextrow][nextcol] == '@') {
                grid[nextrow][nextcol] = '*';
    
                dfs(nextrow, nextcol);
            }
        }
    }
    
    int main(void)
    {
        int m, n, count, i, j;
    
        while(scanf("%d%d", &m, &n) != EOF) {
            // 判定结束条件
            if(m == 0 && n == 0)
                break;
    
            // 清零:边界清零
            memset(grid, 0, sizeof(grid));
    
            // 读入数据
            for(i=1; i<=m; i++)
                scanf("%s", grid[i]+1);
    
            // 计数清零
            count = 0;
    
            // 深度优先搜索
            for(i=1; i<=m; i++)
                for(j=1; j<=n; j++)
                    if(grid[i][j] == '@') {
                        count++;
                        grid[i][j] = '*';
                        dfs(i, j);
                    }
    
            // 输出结果
            printf("%d
    ", count);
        }
    
        return 0;
    }



  • 相关阅读:
    我心中的核心组件(可插拔的AOP)~第十三回 实现AOP的拦截组件Unity.Interception
    .NET 使用unity实现依赖注入
    AOP技术基础
    PowerShell 远程管理之 about_Remote_Troubleshooting
    PowerShell远程连接主机进行会话
    PowerShell_零基础自学课程_9_高级主题:静态类和类的操作
    PowerShell_零基础自学课程_8_高级主题:WMI对象和COM组件
    PowerShell 中的目录文件管理
    解决360浏览器兼容模式不兼容,极速模式兼容问题
    reportng之测试报告升级美化
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564631.html
Copyright © 2011-2022 走看看