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



  • 相关阅读:
    sql server 删除重复数据新思路
    sqlserver 迁移 mysql
    ASP.NET Web deployment task failed. 请与服务器管理员联系,检查授权和委派设置 部署任务失败的解决方案
    数据库交互之减少IO次数
    sqlserver 安全设置
    windows设置相对路径的快捷方式
    利用SignalR实现实时推送信息
    image magick 备忘
    dotnetCore开发中遇到的一些问题
    “NETSDK1061: 项目是使用 Microsoft.NETCore.App 版本 2.1.14 还原的, 但使用当前设置, 将改用版本 2.1.0。”的处理方法
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564631.html
Copyright © 2011-2022 走看看