Date:January 3rd Title:蜜蜂的家 题解

文章介绍了一道编程题,目标是计算在一个由六边形组成的无限大蜂窝中,有多少个包含蜜蜂的“家”。给定有蜜蜂的六边形坐标,通过使用宽度优先搜索(BFS)遍历二维数组,处理每个有蜜蜂的六边形及其相邻的六边形,直至遍历完整个地图,从而得出答案。代码示例中,使用了C++实现这一算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

xjoi题解:P8089 蜜蜂的家

时间:1s 空间:256M

题目描述:

有一个无限大的蜂窝,里面住着一些蜜蜂,如图。

蜜蜂的家是由若干个蜂窝里的六边形连接而成,一个六边形(i,j),与六边形(i−1,j−1),(i−1,j),(i,j−1),(i,j+1),(i+1,j),(i+1,j+1)相邻。

现在小信知道一些六边形上有蜜蜂,请你告诉小信共有多少个蜜蜂的家。

输入格式:

第一行包含一个整数 n,代表有蜜蜂的六边形个数。

接下来 n 行,每行两个整数 xi,yi,表示有蜜蜂的六边形坐标。保证不存在相同的坐标。

输出格式:

输出一个整数表示答案。

样例输入:

7

0 0

1 1

1 0

1 -1

0 2

3 2

3 1

样例输出:

3

约定:

对于100%的数据,1≤n≤10000≤|xi|,|yi|≤1000,保证坐标互不相同。

分析:

哇,六联通题!!!

我们先将有蜜蜂的坐标化为二维数组中0和1,有蜜蜂的位置为1,无蜜蜂的位置为0。

既然是求解蜜蜂的家的个数,自然先想到的办法就是先处理一个蜜蜂,然后处理下一个蜜蜂……然后依次计数蜜蜂的家的个数,也就是每次处理一个蜜蜂的家的时候+1。我们按照这种方法来实现。

与之前的选数字,或者是给出指定入口求解是否能走地图的题目不同。本题需要全部遍历地图,也就是说需要一个一个格子来遍历数组,采用双重的for循环来实现。试想一下:当某一个格子是1时候,我们就从这个格子开始进行bfs,bfs的目的是处理掉与1相连的所有的1,于此同时计数+1。处理完成后,找到下一个是1的格子,再处理掉与此相连的1,计数+1。如此往复,直到处理完整个地图,搜索结束。

那么不难看出,递归边界就是:这个格子在地图外边。进行递归的条件是:当且仅当这个格子是1并且还没有访问过。

还有一点别忘记,此题判定1相邻的条件是六向联通 也就是(i−1,j−1),(i−1,j),(i,j−1),(i,j+1),(i+1,j),(i+1,j+1)相邻也算联通,所以此题是六向搜索。

代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值