您的位置:首页 > 运维架构

AOJ Property Distribution (dfs_连通性)

2015-09-29 21:59 232 查看
タナカ氏が 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

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,ans;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
char ch;

char map[111][111];

void dfs(int x,int y)
{
if(x<1||x>n||y<1||y>m) return ;
if(map[x][y]!=ch) return ;
map[x][y]='.';
for(int i=0;i<4;i++) {
dfs(x+dx[i],y+dy[i]);
}

}

int main()
{
int i,j;
while(cin>>n>>m) {
if(n==0 && m==0 ) break;
for(i=1;i<=n;i++) {
for(j=1;j<=m;j++) cin>>map[i][j];
}
ans=0;
for(i=1;i<=n;i++) {
for(j=1;j<=m;j++){
if(map[i][j]=='.') continue;
ch=map[i][j];
dfs(i,j);
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: