队列之连通块

[问题描述]
一个nm的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0.问有多少个四连通的黑色格子连通块。 四连通的黑色格子连通块指的是一片由黑色格子组成区域,其中的每个黑色格子能通过四连通的走法(上下左右),只走黑色格子,到达该联通块中的其它黑色格子。
[输入]
第一行两个整数n,m(1<=n,m<=100),表示一个n
m的方格图.
接下来n行,每行m个整数,分别为0或1,表示这个格子是黑色还是白色。
[输出]
只有一行,一个整数ans,表示图中有ans个黑色格子连通块.

int a[110][110],q[110][2];//a数组存储所输入的黑格子,这里定义为全局方便直接函数调用
int n,m;
int flag[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//相邻的四个黑格子
bool p[110][110];//p数组用来判断这个黑格子是否被搜索过
void bfs(int x,int y)
{
int front=0,rear=2;
q[1][0]=x;//将新搜索到的点保存到q数组
q[1][1]=y;
while(front<rear-1)//front为队头,rear为队尾
{
front++;
x=q[front][0];
y=q[front][1];
for(int i=0;i<4;i++)
{
int x1=x+flag[i][0];//(x1,y1)就是(x,y)的相邻的点
int y1=y+flag[i][1];
if(x1<1 || x1>n || y1>m || y1<1 || !a[x1][y1] || p[x1][y1])
{
continue;
}
p[x1][y1]=true;
q[rear][0]=x1;//如果这是一个未被搜索到的黑格子,那么就将其入队
q[rear++][1]=y1;//找到后队尾向后延伸

    }
}

}
int main()
{
int ans=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j] && !p[i][j])
{
++ans;
bfs(i,j);
}
}

}
cout<<ans;
return 0;

}

发布了1 篇原创文章 · 获赞 1 · 访问量 43

猜你喜欢

转载自blog.csdn.net/Albert_Jw/article/details/103986921
今日推荐