题目:分子团

题目描述

京京接受了一个用染色法测定平面内分子团数量的工作。已知没有分子的位置用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;

    }

原文地址:https://www.cnblogs.com/noip/p/2291364.html