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

来源:互联网 发布:ultraedit软件下载 编辑:程序博客网 时间:2024/06/05 23:04

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
Prev 
Submit Status Statistics Discuss
 Next

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

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

解题思路:
深度优先搜索
#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define MAX_W 101char 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;}



0 0
原创粉丝点击