zoukankan      html  css  js  c++  java
  • AOJ0118 Property Distribution【DFS】

    タナカ氏が HW アールの果樹園を残して亡くなりました。果樹園は東西南北方向に H × W の区画に分けられ、区画ごとにリンゴ、カキ、ミカンが植えられています。タナカ氏はこんな遺言を残していました。

    果樹園は区画単位でできるだけ多くの血縁者に分けること。ただし、ある区画の東西南北どれかの方向にとなりあう区画に同じ種類の果物が植えられていた場合は、区画の境界が分からないのでそれらは 1 つの大きな区画として扱うこと。

    例えば次のような 3 × 10 の区画であれば ('リ'はリンゴ、'カ'はカキ、'ミ'はミカンを表す)


    同じ樹がある区画の間の境界を消すと次のようになり、


    結局 10 個の区画、つまり 10 人で分けられることになります。

    雪が降って区画の境界が見えなくなる前に分配を終えなくてはなりません。あなたの仕事は果樹園の地図をもとに分配する区画の数を決めることです。

    果樹園の地図を読み込み、分配を受けられる血縁者の人数を出力するプログラムを作成してください。

    Input

    複数のデータセットが与えられます。各データセットは空白で区切られた H, W (H, W ≤ 100) を含む行から始まり、続いて H × W の文字からなる H 行の文字列が与えられます。この文字列には、リンゴを表す '@'、カキを表す '#'、ミカンを表す '*'、の 3 文字しか現れません。

    入力はゼロが2つの行で終わります。データセットの数は 20 を超えません。

    Output

    各データセットごとに、分配を受ける人数を1行に出力してください。

    Sample Input

    10 10
    ####*****@
    @#@@@@#*#*
    @##***@@@*
    #****#*@**
    ##@*#@@*##
    *@@@@*@@@#
    ***#@*@##*
    *@@@*@@##@
    *@*#*@##**
    @****#@@#@
    0 0
    

    Output for the Sample Input

    33


    问题链接:AOJ0118 Property Distribution

    题意简述:财产分割问题。H×W的区间,种有苹果(@)、柿子(#)和桔子(※)的树。问同类水果树连片的共有多少片?

    问题分析:类似于联通图问题,将联通的归为1片,数一下总共有多少片即可。可以使用DFS实现。

    程序说明:

    已经数过的或被合并为一片的标为空格(' ')。

    用递归函数实现。

    需要注意不要越过边界。

    参考链接:HDU1241 POJ1562 UVa572 UVALive5317 Oil Deposits

    题记:(略)

    AC的C++程序如下:

    /* AOJ0118 Property Distribution */
    
    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    #define DIRECTSIZE 4
    struct _direct {
        int drow;
        int dcol;
    } direct[DIRECTSIZE] =
        {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
    
    const int N = 100;
    string grid[N];
    int h, w, ans;
    
    void dfs(int row, int col, char c)
    {
        if(grid[row][col] == c) {
            grid[row][col] = ' ';
    
            for(int i=0; i<DIRECTSIZE; i++) {
                int nextrow = row + direct[i].drow;
                int nextcol = col + direct[i].dcol;
    
                if(0 <= nextrow && nextrow < h && 0 <= nextcol && nextcol < w)
                    if(grid[nextrow][nextcol] != ' ')
                        dfs(nextrow, nextcol, c);
            }
        }
    }
    
    int main()
    {    
        while(cin >> h >> w && (h || w)) {
            getchar();
            for(int i=0; i<h; i++)
                getline(cin, grid[i]);
    
            ans = 0;
            for(int i=0; i<h; i++)
                for(int j=0; j<w; j++) {
                    char c = grid[i][j];
                    if(c != ' ') {
                        ans++;
                        dfs(i, j, c);
                    }
                }
    
            cout << ans << endl;
        }
    
        return 0;
    }









  • 相关阅读:
    智慧养老民政监管平台建设方案
    CF600E Lomsat gelral dsu on tree
    dsu on tree详解
    【Spring 从0开始】Spring5 新功能,整合日志框架 Log4j2
    【Spring 从0开始】JdbcTemplate 数据库事务管理
    【Spring 从0开始】JdbcTemplate 数据库事务参数
    【Spring 从0开始】JdbcTemplate 数据库事务管理
    【Spring 从0开始】JdbcTemplate 操作数据库
    【Spring 从0开始】AOP 操作
    【Spring 从0开始】AOP 操作中的相关术语、环境准备
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563735.html
Copyright © 2011-2022 走看看