天天看点

【BFS】细胞(C++)

题目在https://blog.csdn.net/liuzich/article/details/97273694里面,这里只是展示另一种做法。

本来想复制提交记录,发现只有DFS的,于是又打了一遍。

emmmmm

直接看代码:

#include <bits/stdc++.h>		//万能头文件 
using namespace std;
int n,m,ans=0;
char a;
bool ok[108][108];		//存放是否为细胞数字(是为true,否为false) 
int xx[5]={0,0,0,1,-1},yy[5]={0,1,-1,0,0},p[100008],q[100008];
//xx和yy代表四个方向,p和q数组代表位置的队列 
void bfs(int x,int y) {
	int head=1;		//head是头结点 
	int tail=1;		//tail是尾结点 
	p[1]=x;
	q[1]=y;
	//先把x和y加入队列 
	while(head<=tail)
	{
		for(int i=1;i<=4;i++)
		{
			int h=p[head]+xx[i];	//方向h 
			int l=q[head]+yy[i];	//方向l 
			if(ok[h][l])
			{
				ok[h][l]=false;
				tail++;
				p[tail]=h;		//把坐标h加入队列 
				q[tail]=l;		//把坐标l加入队列 
			}
		}
		head++;		//别漏了 
	}
}
int main() {
	scanf("%d%d",&n,&m);
	memset(ok,false,sizeof(ok));
	/*下面是输入和搜索*/ 
	for(int i=1; i<=n; i++)
		for(int j=1; j<=m; j++) {
			cin>>a;
			if(a!='0')
				ok[i][j]=true;
		}
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			if(ok[i][j]) {
				ans++;
				bfs(i,j);
			}
		}
	}
	printf("%d\n",ans);

	return 0;
}