https://cn.vjudge.net/problem/Aizu-0118
タナカ氏が HW アールの果樹園を残して亡くなりました。果樹園は東西南北方向に H × W の区画に分けられ、区画ごとにリンゴ、カキ、ミカンが植えられています。タナカ氏はこんな遺言を残していました。
果樹園は区画単位でできるだけ多くの血縁者に分けること。ただし、ある区画の東西南北どれかの方向にとなりあう区画に同じ種類の果物が植えられていた場合は、区画の境界が分からないのでそれらは 1 つの大きな区画として扱うこと。
例えば次のような 3 × 10 の区画であれば ('リ'はリンゴ、'カ'はカキ、'ミ'はミカンを表す)
同じ樹がある区画の間の境界を消すと次のようになり、
結局 10 個の区画、つまり 10 人で分けられることになります。
雪が降って区画の境界が見えなくなる前に分配を終えなくてはなりません。あなたの仕事は果樹園の地図をもとに分配する区画の数を決めることです。
果樹園の地図を読み込み、分配を受けられる血縁者の人数を出力するプログラムを作成してください。
Input
複数のデータセットが与えられます。各データセットは空白で区切られた H, W (H, W ≤ 100) を含む行から始まり、続いて H × W の文字からなる H 行の文字列が与えられます。この文字列には、リンゴを表す '@'、カキを表す '#'、ミカンを表す '*'、の 3 文字しか現れません。
入力はゼロが2つの行で終わります。データセットの数は 20 を超えません。
Output
各データセットごとに、分配を受ける人数を1行に出力してください。
Sample Input
10 10 ####*****@ @#@@@@#*#* @##***@@@* #****#*@** ##@*#@@*## *@@@@*@@@# ***#@*@##* *@@@*@@##@ *@*#*@##** @****#@@#@ 0 0
Output for the Sample Input
33
-
题意:给定一个矩阵,同类字符相连的为一个块,问总共有几个块。
-
输入:h,w(行和列)0 <= h <= 100,0 <= w <= 100
-
矩阵
-
输入包含多组用例,以0,0结束
-
输出:块数
-
#include <bits/stdc++.h> using namespace std; char mp[101][101]; int n,m,ans; int dr[4][2]= {-1,0,1,0,0,1,0,-1}; void dfs(int x,int y,int ch) { mp[x][y]='o'; for(int i=0; i<4; i++) { int tx=x+dr[i][0]; int ty=y+dr[i][1]; if(tx<0||tx>=n||ty<0||ty>=m||mp[tx][ty]!=ch) continue; dfs(tx,ty,mp[tx][ty]); } } int main() { while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; for(int i=0; i<n; i++) scanf("%s",&mp[i]); ans=0; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(mp[i][j]!='o') { ans++; dfs(i,j,mp[i][j]); } } } cout<<ans<<endl; } return 0; }