题目:分子团
题目描述
京京接受了一个用染色法测定平面内分子团数量的工作。已知没有分子的位置用0表示。被染色的部分根据其染色深度用1~9表示。由于这些分子具有特殊性,它的延展方向在平面内只有前、后、左、右4个方向。在延伸方向上相互接触的分子构成一个分子团。在一个M×N的矩形区域内,请你帮他统计出分子团的数量(X)。
输入格式
第一行 M N (2<=[M,N]<=100)
第二行 N个0~9之间的数字
……
第M+1行 N个0~9之间的数字
输出格式
X
分析:———————————————————————————————————————————————————
做的题目太少了,这种题是第一次做,竟花了我半个多小时,惭愧。
floodfill 算法。
代码实现:
#include<iostream>
using namespace std;
int m,n,map[101][101],total=0;
void dfs(int i,int j){
if(i+1<=m&&map[i+1][j]==1) {map[i+1][j]=0;dfs(i+1,j);} //一定是先染色,再DFS,否则就会死循环了。
if(i-1>=1&&map[i-1][j]==1) {map[i-1][j]=0;dfs(i-1,j);}
if(j+1<=n&&map[i][j+1]==1) {map[i][j+1]=0;dfs(i,j+1);}
if(j-1>=1&&map[i][j-1]==1) {map[i][j-1]=0;dfs(i,j-1);}
}
int main()
{
int i,j;char a;
cin>>m>>n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{cin>>a;if(a!='0') map[i][j]=1;else map[i][j]=0;}
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(map[i][j]==1) {dfs(i,j);total++;}
cout<<total<<endl;
return 0;
}