基础算法——深度优先经典——岛屿问题

序言

        在此之前,我曾见过许多的学生提及算法唯恐避之不及,几乎所有人都知道算法只不过是思考问题的方法,但很遗憾,大部分人并未体会到算法的乐趣所在,而是被所谓的一些优秀者口中的“神圣”的算法策略给唬住,而不敢向前。

 

     “我致力于整治学界的一些不良的风气——它们将普普通通解决问题的方法给复杂化,特殊化,似乎只有聪明人才能学会。以及某些为了彰显自己很聪明,故意吓唬新手的不道德之人。”

当我在大学学习算法之时——那时候还是用C语言来进行的。的确遇到了很多的挫折:尽管教授已经很努力的将一些经典问题详尽的解释给我们这些学生,但我们还是昏昏欲睡,不知所云。 我发现这不是个例,几乎所有的在校生都听不懂教授在说什么,而在我日后的学习中才逐渐发现预习的重要性。此处所谓的预习并不是指看书或者单纯的写习题之类的,我所谓的预习是提前知道即将学到的内容可以被运用到哪些地方,以及可以使用何种手段将其实现,努力寻找其与曾经学过知识的共同之处。

正文:

在深度优先遍历中可以举例而出的经典例题中,岛屿问题应当名列前茅。

如果你的确很新手,也很害怕我即将说出的内容,那么恭喜你,你即将成为本章内容的最大获益者,或者说我之所以写下这篇文章,就是因为你。

首先我们先明确一下接下来的任务,在完全不了解什么为深度优先的时候贸然为自己定下一篇文章就让自己看懂是不现实的。

事实上,深度优先的题目除了会写出大部分题解和找出规律之外,大多数人离不会也仅仅一步之遥。限制解题有太多因素,可能你掌握了所有的语言基础,但题目可能是一道拓扑类型的题,或是一道数学题。

因此下面的内容你可以看不懂,也可能因为其中的一些知识点而没弄清楚,这很正常,请你务必先略过他,将文章全部看完。

岛屿问题的基本思路是使用递归:

递归的时候首先确定边界条件,

再对细节进行操作,其中包含着递归对象的确立。

下面是题目以及题解:

        给定一个由0和1组成的非空二维数组grid ,用来表示海洋岛屿地图。一个岛屿是由一些相

邻的1 (代表土地)构成的组合,这里的「相邻」要求两个1必须在水平或者竖直方向上相邻。

你可以假设grid的四个边缘都被0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。

如果没有岛屿,则返回面积为0

 递归的解: 

 在上面的dfs函数中,首先对递归条件进行限制:

所有在边界之上的,超出边界的,以及值为0的,函数都会直接结束,并返回0。

若不满足上面的条件——则对这个值四周的值也进行该过程,接着对其四周值的四周的值也进行该过程。


题外话:

大家是否听说过生命模拟这个代码游戏,与其说是游戏不如说的演化过程,就像病毒在一个点向四周扩散,遇到每个细胞,每个细胞会作为主体重新扩散,由于时间差,会重新影响到最初的细胞。这样的过程由于时间的流逝,细胞们的反馈会渐渐变得复杂起来,就好像有着生命一般。

而递归则像是打台球,你可以掌控游戏规则。

你可以对游戏何时结束,或者以什么条件结束进行限定。

也可以设置台球每次反弹的力度大小,被这个台球撞到的未知台球会被同化,接着每个被撞到的未知台球都会被同化,持续这样的过程直到所有的台球都满足了你的终止条件。游戏结束。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值