zoukankan      html  css  js  c++  java
  • HDU1241

    GeoSurvComp地质调查公司负责探测地下石油储藏。 GeoSurvComp现在在一块矩形区域探测石油,并把这个大区域分成了很多小块。他们通过专业设备,来分析每个小块中是否蕴藏石油。如果这些蕴藏石油的小方格相邻,那么他们被认为是同一油藏的一部分。在这块矩形区域,可能有很多油藏。你的任务是确定有多少不同的油藏。

    Input

    输入可能有多个矩形区域(即可能有多组测试)。每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m =0表示输入的结束,接下来是n行,每行m个字符。每个字符对应一个小方格,并且要么是'*',代表没有油,要么是'@',表示有油。

    Output

    对于每一个矩形区域,输出油藏的数量。两个小方格是相邻的,当且仅当他们水平或者垂直或者对角线相邻(即8个方向)。

    Sample Input

    1 1

    *

    3 5

    *@*@*

    **@**

    *@*@*

    1 8

    @@****@*

    5 5 

    ****@

    *@@*@

    *@**@

    @@@*@

    @@**@

    0 0 

    思路:这是一道深搜的问题,比较简单,就是要注意八个方向,

    #include <iostream>
    #include<cstdio>
    using namespace std;
    int m,n;
    char a[101][101];
    void dfs(int x,int y)
    {
        if(0<=x && x<m && 0<=y && y<n && a[x][y]=='@')
        {                        //确保不越界
            a[x][y]='#';           //置0,表示已经搜索过了
            dfs(x,y-1);
            dfs(x,y+1);
            dfs(x-1,y);
            dfs(x+1,y);
            dfs(x+1,y+1);
            dfs(x+1,y-1);
            dfs(x-1,y+1);
            dfs(x-1,y-1);
        }
    }
    int main()
    {
        while(scanf("%d%d",&m,&n)!=EOF && m+n)
        {
            int count=0;
        for(int i=0;i<m;++i)
            scanf("%s",&a[i]);
        for(int i=0;i<m;++i)
        {
            for(int j=0;j<n;++j)
            {
                if(a[i][j]=='@')
                {
                    dfs(i,j);
                    ++count;      //直到附近搜索完成后水池数目加一
                }
            }
        }
        printf("%d
    ",count);
        }
        return 0;
    }
  • 相关阅读:
    Palindrome Partitioning
    triangle
    Populating Next Right Pointers in Each Node(I and II)
    分苹果(网易)
    Flatten Binary Tree to Linked List
    Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历构建二叉树)
    iOS系统navigationBar背景色,文字颜色处理
    登录,注销
    ios 文字上下滚动效果Demo
    经常崩溃就是数组字典引起的
  • 原文地址:https://www.cnblogs.com/aerer/p/9931005.html
Copyright © 2011-2022 走看看