AOJ Property Distribution (dfs_连通性)
2015-09-29 21:59
232 查看
タナカ氏が HW アールの果樹園を残して亡くなりました。果樹園は東西南北方向に H×W の区画に分けられ、区画ごとにリンゴ、カキ、ミカンが植えられています。タナカ氏はこんな遺言を残していました。
果樹園は区画単位でできるだけ多くの血縁者に分けること。ただし、ある区画の東西南北どれかの方向にとなりあう区画に同じ種類の果物が植えられていた場合は、区画の境界が分からないのでそれらは 1 つの大きな区画として扱うこと。
例えば次のような 3x10 の区画であれば(リはリンゴ、カはカキ、ミはミカンを表す)
同じ樹がある区画の間の境界を消すと次のようになり、
結局 10 個の区画、つまり 10 人で分けられることになります。 雪が降って区画の境界が見えなくなる前に分配を終えなくてはなりません。あなたの仕事は果樹園の地図を もとに分配する区画の数を決めることです。ということで、果樹園の地図を読み込み、分配を受けら れる血縁者の人数を出力して終了するプログラムを作成してください。ただし、果樹園の地図は W 文字×H 行の文字列として与えられます。この文字列には、リンゴを表す@、カキを表す#、ミカンを表す*、の 3 文字しか使われていません。
複数のデータセットが与えられます。各データセットは空白で区切られたH Wを含む行から始まり、続いてH × Wの文字が与えられます。入力はゼロが2つの行で終わります。
H, W は100以下です。
各データセットごとに、分配を受ける人数を1行に出力してください。
33
果樹園は区画単位でできるだけ多くの血縁者に分けること。ただし、ある区画の東西南北どれかの方向にとなりあう区画に同じ種類の果物が植えられていた場合は、区画の境界が分からないのでそれらは 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#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,ans; int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0}; char ch; char map[111][111]; void dfs(int x,int y) { if(x<1||x>n||y<1||y>m) return ; if(map[x][y]!=ch) return ; map[x][y]='.'; for(int i=0;i<4;i++) { dfs(x+dx[i],y+dy[i]); } } int main() { int i,j; while(cin>>n>>m) { if(n==0 && m==0 ) break; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) cin>>map[i][j]; } ans=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++){ if(map[i][j]=='.') continue; ch=map[i][j]; dfs(i,j); ans++; } } cout<<ans<<endl; } return 0; }
相关文章推荐
- Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7) 【转】
- Linux内存管理 【转】
- Linux经常使用的命令-权利管理命令-权利管理命令chmod
- 彻底销毁你的Linux服务器
- linux tar打包指令
- 使用OpenRowSet操作Excel
- Linux系统上安装字体
- OpenGL几何变换
- ubuntu14.0(linux) 安装 apache2.4+ 报 apr not found
- 坑爹流氓网站360.cn
- 流氓网站 星火软件veryhuo.com
- 超级流氓网站ddooo.com
- shell 之进行数学运算 let expr bc 中括号
- opengl 获取鼠标在世界坐标系中的坐标
- 在linux操作系统下使用github的基本流程
- 五种开源协议(GPL,LGPL,BSD,MIT,Apache)
- Marshal.StructureToPtr(Object, IntPtr, Boolean)[将数据从托管对象封送到非托管内存块]
- 用OpenCV进行人脸检测遇到的无法显示人像的问题
- Linux环境下通过ODBC访问MSSql Server
- shell脚本编程-例子_批量添加用户脚本