【算法渣渣的逆袭之路】Property Distribution Aizu - 0118

Property Distribution Aizu - 0118

问题描述

タナカ氏が 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

现在在跟着挑战程序设计后面的题在做,发现了这道题,打开之后发现是日文,瞬间崩溃有木有,用有道翻译,很不通顺有木有,最后是在网上找的这道题的中文翻译

在H W的矩形果园里有苹果、梨、蜜柑三种果树, 相邻(上下左右)的同种果树属于同一个区域,给出果园的果树分布,求总共有多少个区域。(原题的样图中苹果为リ,梨为カ,蜜柑为ミ, 图中共10个区域) 输入:多组数据,每组数据第一行为两个整数H、W(H <= 100, W <= 100), H =0 且 W = 0代表输入结束。以下H行W列表示果园的果树分布, 苹果是@,梨是#, 蜜柑是。 输出:对于每组数据,输出其区域的个数。

这道题的思路呢,和那个 Red and Black-POJ - 1979的思路其实是一样的,只是这道题需要搜索的点增加到了三个,这是我们就可以考虑对于搜索过的点标记为这三种之外的其他类型。下面给出代码:

#include <iostream>
using namespace std;
int n,m;
char map[110][110];
void dfs(int x,int y,char ch)
{   
    int dir[4][2]={1,0,-1,0,0,1,0,-1};
    int x1,y1;
    map[x][y]='.';
    for(int i=0;i<4;i++)
    {
        x1=x+dir[i][0];
        y1=y+dir[i][1];
        if(x1>=0&&x1<n&&y1>=0&&y1<m&&map[x1][y1]==ch)
        dfs(x1,y1,ch);
    }
} 

int main(int argc, char *argv[])
{   
    char ch;
    while(cin>>n>>m)
    {   
        int ans=0;
        if(n==0||m==0) break;

        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            cin>>map[i][j];
        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if(map[i][j]!='.')
                {
                ch=map[i][j];
                ans++;
                dfs(i,j,ch);
                }   
    cout<<ans<<endl;             
    }
    return 0;
}

顺便贴张图记录我A题的心酸

顺便贴张图记录我A题的心酸

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值