Time Limit: 1000MS | Memory Limit: 65536KB | 64bit IO Format: %lld & %llu |
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
基础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;
}