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;
    }
  • 相关阅读:
    如何找出数组中重复次数最多的数
    如何计算两个有序整型数组的交集
    如何分别使用递归与非递归实现二分查找算法
    如何用递归算法判断一个数组是否是递增
    如何用一个for循环打印出一个二维数组
    如何用递归实现数组求和
    ElasticSearch安装和head插件安装
    SpringBoot全局异常处理方式
    Redis高级命令操作大全--推荐
    Mysql中FIND_IN_SET和REPLACE函数简介
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/3916817.html
Copyright © 2011-2022 走看看