细胞问题(广搜练习题)

题目

一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。

样例输入

4 10
0234500067
1034560500
2045600671
0000000089
输出

4

思路

扫描整个矩阵,找到第一个不为0的数字,也就是细胞,然后将这个数字周围所有的非0数字变成false,然后细胞数+1,就可以得到最终结果了。

#include
#define sr c=getchar()
#define input read()
#define pd (c<'0'||c>'9')
#define fk f=f*10+c-48
#define ps if (c=='-') d=-1
using namespace std;int n,m;
bool b[101][101];char c;
int state[10001][3],father[10001];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int s;
int read()
{
	int d=1,f=0;char c;
	while (sr,pd) ps;fk;
	while (sr,!pd) fk;
	return d*f;
}
void write(int x)
{
	if (!x) return;
	write(x/10);
	putchar(x%10+48);
}
void bfs(int x,int y)//从发现的位置找它周围的细胞
{
	int head=0,tail=1;b[x][y]=false;state[1][1]=x;state[1][2]=y;//初始化
	do
	{
		head++;
		for (int i=0;i<4;i++)
		 {
		 	int x=state[head][1]+dx[i];
		 	int y=state[head][2]+dy[i];
		 	if (x>0&&y>0&&x<=m&&y<=n&&b[x][y])//如果它们是连在一起的
		 	{
		 		tail++;
		 		father[tail]=head;
		 		state[tail][1]=x;
		 		state[tail][2]=y;
		 		b[x][y]=false;//将周围的细胞变成0
		 	}
		 }
	}while(head='1'&&c<='9') b[i][j]=true;//如果是细胞,b[i][j]就是true
	 }
	 c=getchar();//换行
    }
    for (int i=1;i<=m;i++)
     for (int j=1;j<=n;j++)
      	if (b[i][j])//如果这是细胞
      	{
  	    	bfs(i,j);//将细胞周围的清0
    	  	s++;//细胞数+1
      	}
    write(s);//输出
}


你可能感兴趣的:(bfs)