题目
タナカ氏が HW アールの果樹園を残して亡くなりました。果樹園は東西南北方向に H×W の区画に分けられ、区画ごとにリンゴ、カキ、ミカンが植えられています。タナカ氏はこんな遺言を残していました。
果樹園は区画単位でできるだけ多くの血縁者に分けること。ただし、ある区画の東西南北どれかの方向にとなりあう区画に同じ種類の果物が植えられていた場合は、区画の境界が分からないのでそれらは 1 つの大きな区画として扱うこと。
例えば次のような 3 × 10 の区画であれば ('リ’はリンゴ、'カ’はカキ、'ミ’はミカンを表す)
同じ樹がある区画の間の境界を消すと次のようになり、
結局 10 個の区画、つまり 10 人で分けられることになります。
雪が降って区画の境界が見えなくなる前に分配を終えなくてはなりません。あなたの仕事は果樹園の地図をもとに分配する区画の数を決めることです。
果樹園の地図を読み込み、分配を受けられる血縁者の人数を出力するプログラムを作成してください。
输入
複数のデータセットが与えられます。各データセットは空白で区切られた H, W (H,W ≤ 100) を含む行から始まり、続いて H×W の文字からなる H 行の文字列が与えられます。この文字列には、リンゴを表す ‘@’、カキを表す ‘#’、ミカンを表す ‘*’、の 3 文字しか現れません。
入力はゼロが2つの行で終わります。データセットの数は 20 を超えません。
输出
各データセットごとに、分配を受ける人数を1行に出力してください。
样例输入
10 10
####@
@#@@@@##
@##@@@*
#***#@
##@#@@##
@@@@@@@#
#@@##
@@@@@##@
@#@##**
@****#@@#@
0 0
样例输出
33
思路
dfs
CODE
#include<iostream>
using namespace std;
const int MAX = 105;
char map[MAX][MAX];
bool visit[MAX][MAX];
int h, w;
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
void bfs(int x, int y)
{
visit[x][y] = true;
int xx, yy;
for (int i = 0; i < 4; i++)
{
xx = x + dx[i];
yy = y + dy[i];
if (xx >= 0 && xx < h&&yy >= 0 && yy < w)
{
if (map[x][y] == map[xx][yy] && !visit[xx][yy])
{
bfs(xx, yy);
}
}
}
}
int main()
{
int i, j;
while (cin >> h >> w)
{
if (h == 0 && w == 0)
{
break;
}
for (i = 0; i < h; i++)
{
for (j = 0; j < w; j++)
{
cin >> map[i][j];
visit[i][j] = false;
}
}
int sum = 0;
for (i = 0; i < h; i++)
{
for (j = 0; j < w; j++)
{
if (!visit[i][j])
{
bfs(i, j);
sum++;
}
}
}
cout << sum << endl;
}
system("pause");
return 0;
}