[BFS]细胞问题

细胞问题


题目描述
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(1<=m,n<=100)?


输入格式
输入:整数m,n(m行,n列)

矩阵


输出格式
输出:细胞的个数


输入输出样例


输入 #1

4 10
0234500067
1034560500
2045600671
0000000089


输出 #1
4


代码

#include<stdio.h>
#include<iostream>
using namespace std;
bool f[10005][10005]={false};
int n,m,a[11005][11005],ans=0,st[10005][3];
const int dx[5]={0,0,0,1,-1};
const int dy[5]={0,1,-1,0,0}; //四个方向
void bfs(int i,int j){
	int head=0,tail=1; //每次head清0,tail清1
	st[1][1]=i;st[1][2]=j;f[i][j]=1; 
	ans++;
	do{ 
		head++;
		for(int i=1;i<=4;i++){
			int x=st[head][1]+dx[i];
			int y=st[head][2]+dy[i];
			if(!f[x][y]) //判断有没有用过
			 if(a[x][y]!=0) //判断是不是细胞数字
			  if(x>=1&&x<=n&&y>=1&&y<=m){
			  	tail++;
			  	st[tail][1]=x;
			  	st[tail][2]=y;
			  	f[x][y]=true; //标记
			  }
		}
	}while(head<=tail);
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=m;j++)
	  scanf("%1d",&a[i][j]);
	for(int i=1;i<=n;i++)
	 for(int j=1;j<=m;j++) //一个一个枚举
	  if(a[i][j]!=0 and !f[i][j])bfs(i,j);
	printf("%d",ans);
	return 0;
} 
原文地址:https://www.cnblogs.com/luojunhang/p/12300159.html