zoukankan      html  css  js  c++  java
  • A

    搜索都不熟练,所以把以前写的一道搜索复习下,然后下一步整理搜索和图论和不互质的中国剩余定理的题

    Description

    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 
     

    Sample Output

    
    
    0
    1
    2
    2
     
    这道题问油田的块数,也就是说有多少相邻的黑方格数
    两重for循环遍历所有的小方格,用mat[i]存放的字符表示第i个小方格是否有油,vis[i] = 0表示这个方格没有被遍历过,vis[i] = 1标记访问过的方格;
    在这两重for循环中遇到有油而且没有被访问过的方格就进入dfs函数找他周围的油田,同时coun++,也就是说又发现了一块油田
    dfs函数以一个方格为中心,(记得每次遍历一个方格都要改变它的标记状态,vis[i] = 1)遍历它周围的所有方格,遇到边界返回,遇到没有油或者访问过的方格返回。
    #include "stdio.h"
    #include "string.h"
    int n, m;
    char mat[105][105];
    int vis[105][105];
    void dfs(int x, int y)
    {
        if(x < 0 || x >= m || y < 0 || y >= n) return;
        if((mat[x][y]  != '@')|| vis[x][y]) return;
        mat[x][y] = 1;
        for(int i = -1; i <= 1; i++)
        {
            for(int j = -1; j <= 1; j++)
                if(i != 0 || j != 0)
                dfs(x+i, y+j);
        }
    }
    int main()
    {
        while(scanf("%d%d", &m, &n) != EOF)
        {
            if(m == 0)
                break;
            int coun = 0;
            memset(vis, 0, sizeof(vis));
            for(int i = 0; i < m; i++)
            {
                scanf("%s", mat[i]);
            }
            for(int i = 0; i < m; i++)
            {
                for(int j = 0; j < n; j++)
                {
                    if((mat[i][j] == '@') && vis[i][j] == 0)
                    {
                        dfs(i, j);
                        ++coun;
                    }
                }
            }
            printf("%d
    ", coun);
        }
        return 0;
    }
  • 相关阅读:
    Vijos1986
    vijos1790
    洛谷1005
    洛谷3381
    bzoj4034
    bzoj1564
    bzoj2648
    洛谷3348
    jzoi4964
    codevs3990
  • 原文地址:https://www.cnblogs.com/rain-1/p/4790497.html
Copyright © 2011-2022 走看看