题目在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;
}