[DFS] AOJ 0118 Property Distribution

Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %lld & %llu

 Status

Description

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

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

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

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

結局 10 個の区画、つまり 10 人で分けられることになります。 雪が降って区画の境界が見えなくなる前に分配を終えなくてはなりません。あなたの仕事は果樹園の地図を もとに分配する区画の数を決めることです。ということで、果樹園の地図を読み込み、分配を受けら れる血縁者の人数を出力して終了するプログラムを作成してください。ただし、果樹園の地図は W 文字×H 行の文字列として与えられます。この文字列には、リンゴを表す@、カキを表す#、ミカンを表す*、の 3 文字しか使われていません。

Input

複数のデータセットが与えられます。各データセットは空白で区切られたH Wを含む行から始まり、続いてH × Wの文字が与えられます。入力はゼロが2つの行で終わります。

H, W は100以下です。

Output

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

Sample Input

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

Output for the Sample Input

33


题意:在W*H的方格中,各种不同的果树用不同的字符表示,统计有多少个连成块的果树

基础DFS,在dfs维度上增加一个char,用于对种类的判断,其他所有的都是基础DFS做法。。

话说这是第一次做日本网站的题目,日本的OJ真是各种高大上。。设计的版面不得不说,做的很漂亮。。


#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define MAX_N 100000 * 2 + 16
using namespace std;
int W,H;
bool vis[105][105];
char G[105][105];
int dx[]={ 1,-1, 0, 0};
int dy[]={ 0, 0,-1, 1};

void dfs(int x,int y,char c)
{
    G[x][y] = '.';
    for(int i = 0;i<4;i++)
    {
        int nx = x+dx[i], ny = y+dy[i];
        if(nx>0 && nx<=H && ny>0 && ny<=W && G[nx][ny] == c)
            dfs(nx,ny,c);
    }
}

int main()
{
    while(cin>>H>>W) // H高度,W宽度
    {
        if (W==0 && H==0) break;
        memset(G,0,sizeof(G));

        for(int i =1;i<=H;i++)
            for(int j = 1; j<=W;j++)
                cin>>G[i][j];
        int sum = 0;
        for(int i = 1; i<=H;i++)
        {
            for(int j = 1; j<=W;j++)
            {
                if (G[i][j] != '.')
                {
                    dfs(i,j,G[i][j]);
                    sum++;
                }
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值