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;
}



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