ACM Property Distribution(挑战程序设计竞赛)

Property Distribution

Time Limit: 1000ms
Memory Limit: 65536KB
This problem will be judged on Aizu. Original ID: 0118
64-bit integer IO format: %lld      Java class name: Main

Property Distribution

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

Source

题目大意:果园里有三种类型的果树,分别是@,#,*,上下左右相同类型的果树算在一个区域
求果园里共有多少个区域,W<=100,H<=100,W=0并且H=0输入结束.

解题思路:
深度优先搜索
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define MAX_W 101

char map[MAX_W][MAX_W];
int w,h;
bool vis[MAX_W][MAX_W];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};

void dfs(int x,int y)
{
	vis[y][x]=true;

	for(int i=0;i<4;i++)
	{
		int nx=x+dx[i],ny=y+dy[i];
		if(nx>=0 && nx<w && ny>=0 && ny<h && !vis[ny][nx] && map[y][x]==map[ny][nx])
			dfs(nx,ny);
	}
}

int main()
{
	scanf("%d%d",&h,&w);

	while(w!=0 || h!=0)
	{
		for(int i=0;i<h;i++)
		{
			scanf("%s",map[i]);
		}

		memset(vis,0,sizeof(vis));

		int cnt=0;

		for(int i=0;i<h;i++)
		for(int j=0;j<w;j++)
			if(!vis[i][j])
			{
				dfs(j,i);
				cnt++;
			}

		printf("%d\n",cnt);

		scanf("%d%d",&h,&w);
	}

	return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章