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\n", count);
    }

    return 0;
}



posted on 2016-07-14 08:43  海岛Blog  阅读(118)  评论(0编辑  收藏  举报

导航