zoukankan      html  css  js  c++  java
  • Oil Deposits(poj 1526 DFS入门题)

    http://poj.org/problem?id=1562

                                                                                                       Oil Deposits
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 12595   Accepted: 6868

    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
    题目大意:如果'@'周围的8个方向有'@'就认为它们是同一油田。求总油田的个数。
    本题是dfs的入门题,我的dfs只能用很烂来形容,dfs利用了栈的思想,先进后出。
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <stdlib.h>
    #define N 1000001
    using namespace std;
    int n,m;
    char map[101][101];
    int v[101][101];
    int jx[]={1,1,1,-1,-1,-1,0,0};
    int jy[]={-1,0,1,-1,0,1,-1,1};
    void dfs(int x,int y)
    {
        v[x][y]=1;
        int tx,ty;
        for(int i=0;i<8;i++)
        {
           tx=x+jx[i];
           ty=y+jy[i];
           if(tx>=0&&tx<n&&ty>=0&&ty<m&&map[tx][ty]=='@'&&v[tx][ty]==0)
           {
               dfs(tx,ty);
           }
        }
    }
    int main()
    {
        int ans=0;
        while(scanf("%d%d",&n,&m)!=EOF&&n!=0)
        {
            ans=0;
            for(int i=0;i<n;i++)
            {
                scanf("%*c%s",map[i]);
            }
            memset(v,0,sizeof(v));
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++)
                {
                    if(map[i][j]=='@'&&v[i][j]==0)
                    {
                        dfs(i,j);
                        ans++;
                    }
    
                }
            }
            printf("%d
    ",ans);
    
        }
        return 0;
    }
  • 相关阅读:
    作业day17
    python开发学习day17 (生成器;面向过程;三元表达式;生成式,内置函数)
    作业day16
    python开发学习day16 (三层装饰器;迭代器)
    python开发学习day15 (叠加装饰器;递归调用;匿名函数)
    作业day14
    python开发学习day14 (装饰器;语法糖;装饰器模板)
    python开发学习day13 (函数嵌套;名称空间与作用域;闭包函数)
    作业day12
    Python-简单算法程序
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/3916817.html
Copyright © 2011-2022 走看看