第十四届蓝桥杯省赛C++B组题目及解析(二)

此篇接续上一篇之后的题目,为4-6题,如果需要前三题的解析请看上一篇博客(第十四届蓝桥杯省赛C++B组题目及解析-优快云博客

第四题题目链接:4959. 岛屿个数 - AcWing题库

小蓝得到了一副大小为 M×N的格子地图,可以将其视作一个只包含字符 0(代表海水)和 1(代表陆地)的二维数组,地图之外可以视作全部是海水,每个岛屿由在上/下/左/右四个方向上相邻的 1 相连接而形成。

在岛屿 A所占据的格子中,如果可以从中选出 k 个不同的格子,使得他们的坐标能够组成一个这样的排列:(x0,y0),(x1,y1),...,(xk−1,yk−1),其中 (x(i+1)%k,y(i+1)%k) 是由 (xi,yi) 通过上/下/左/右移动一次得来的 (0≤i≤k−1),此时这 k个格子就构成了一个 “环”。

如果另一个岛屿 B所占据的格子全部位于这个 “环” 内部,此时我们将岛屿 B 视作是岛屿 A的子岛屿。若 B是 A 的子岛屿,C 又是 B 的子岛屿,那 C 也是 A的子岛屿。

请问这个地图上共有多少个岛屿?

在进行统计时不需要统计子岛屿的数目。

在处理这种地图题目,有一种惯用的套路就是将数据中的地图外围再扩大一圈,扩大的作用不仅可以用来更好的进行后续的数据处理,还能防止在进行dfs或bfs在处理到边界点由于越界而产生奇怪的错误。本题中同样可以利用扩大一圈的方法将周围用一圈海水进行填充。

分析题目给的两个样例,样例一中存在子岛的情况,子岛在计算岛屿的数量的过程中是不算的,因此需要考虑如何判断一个岛是不是子岛。如果一个岛被另一个环形的岛屿完全包围了那么就成为了一个子岛,而是否完全包围可以通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值