0118 - Property Distribution

#include <iostream>
#include <string>
using namespace std;

int H, W;
string field[100];

void dfs(int i, int j, char fruit)	{
	field[i][j]='.';
	if (j+1<W && field[i][j+1]==fruit)	dfs(i,j+1,fruit);
	if (i+1<H && field[i+1][j]==fruit)	dfs(i+1,j,fruit);
	if (0<=j-1 && field[i][j-1]==fruit)	dfs(i,j-1,fruit);
	if (0<=i-1 && field[i-1][j]==fruit)	dfs(i-1,j,fruit);
}

void Slove(void)	{
	int answer=0;

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

int main(void)	{
	while ( cin >> H >> W && (H || W) )
		Slove();
	return 0;
}

深さ優先探索を用いるだけ。