您的位置:首页 > 其它

SSL-ZYC 2324 细胞问题

2017-12-30 14:28 204 查看
题目大意:

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

比如:



一共有4个细胞。

思路:

这是一道BFS的题目,从a[1][1]搜到a
[m],找到一个细胞就把这个细胞和紧挨着的细胞清零,并计数。


也就是说,每找到一个细胞就进行一次BFS,将相邻的细胞清零后继续寻找下一个细胞。

(温馨提示:数字1,2,3,4,5,6,7,8,9其实没有区别,都是细胞,不需要分开处理)

代码:

#include <iostream>
#include <cstdio>
using namespace std;
bool a[101][101];
int n,m,father[10001],state[3][10001],sum;
int dx[5]={0,0,0,1,-1};
int dy[5]={0,-1,1,0,0};

void bfs(int x,int y)
{
int head,tail,i,j,qx,qy;
head=0;
tail=1;
father[1]=0;
a[x][y]=0;
state[1][1]=x;
state[2][1]=y;  //初始化
do
{
head++;
for (i=1;i<=4;i++)
{
qx=state[1][head]+dx[i];  //qx表示行
qy=state[2][head]+dy[i];  //qy表示列
if (qx>0&&qx<=n&&qy>0&&qy<=m&&a[qx][qy])  //如果没出界并且是细胞
{
tail++;
father[tail]=head;  //入队
state[1][tail]=qx;
state[2][tail]=qy;
a[qx][qy]=0;
}
}
}
while(head<tail);
}
int main()
{
int i,j;
char read;
scanf("%d%d\n",&n,&m);
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
{
read=getchar();
if (read>='1'&&read<='9') a[i][j]=1;
}
read=getchar();
}
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)  //一个一个找细胞
{
if (a[i][j]==1)  //如果这是细胞
{
bfs(i,j);  //寻找与它相邻的细胞
sum++;  //计数
}
}
printf("%d",sum);
return 0;
}


(这道题和找石油很像,方法基本一样)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: