当前课程知识点:程序设计基础 > 第五章 分治思想与递归 > 5.5 青蛙过河 > 5.5.3 问题分析——复杂情况
刚才没有柱子确实是太简单了
我们现在要退到一般的情形
有柱子了所以我们要考虑的是Jump(s,y)
那么还是先看最简单的情形
尽管有柱子我们也看简单的
那当然是一根柱子
一根柱子有多少片荷叶呢
我们暂时还是让它只有一片荷叶
所以呢 s=1 y=1
那这个时候我们可以从图上看到
L R 一片荷叶 一根柱子
那怎么跳呢
大家想一想
在小溪当中的柱子 根据题目的要求
是可以多只青蛙摞起来的
很显然 如果让1号青蛙直接奔着S去是很亏的
所以应该是1号往Y荷叶上跳
如果你说我怎么想到这个呢
我们可以利用第三章所学的枚举思想
你想一想 青蛙最开始都在L柱子上
它们有哪些地方可以去呢
不就三个地方吗
中间的柱子S 中间的荷叶Y 右边的柱子
就三个地方 依次去就看直接第一只青蛙该往哪跳
你说往右边柱子上跳 完了跳过去这个题目就终了
只能跳过去一只青蛙
你说往这个s柱子跳
那跳完了上面也不能再落了
因为这是最小号的青蛙啊
所以我们第一只青蛙应该是蹦到y上去
你这么一想不就是想出来了吗
所以再复杂的问题 哪怕是感觉复杂
你也应该想到以前学过的知识是不是可以拿来用呢
用一个枚举法用一个穷举把所有可能性依次考虑一遍
很快就能得到一个答案
1号青蛙跳到荷叶y上
那么2号青蛙以此类推
跳荷叶 不允许
跳右边的柱子R 好像也不太对
所以2号青蛙跳到S柱子上去
都是用这种枚举 把所有可能性都考虑进来
一一比较 最后得到该怎么跳
这也是一个比较容易运用的思想 我们上一节已经学过
2号青蛙到了S柱子 3号青蛙到哪里去呢
3号青蛙 那么它可以蹦到R上面去
那么有没有别都办法呢
注意 因为这个时候在小溪的Y上面
已经有只青蛙了 所以这个时候下一步
并不见得只能是L上到青蛙去做动作
可以是Y上面的青蛙 可以是S上面的青蛙
去做动作 所以又有三种可能性
那我们到底该怎么办呢
我们想一想 我们发现
S上的青蛙如果走的话 不太好
所以我们可以把Y上面的青蛙给腾出来
也就是说 Y上面那只小青蛙可以蹦到S上去 摞起来
那这样的话 S柱子就摞了两只青蛙
这个时候Y空了
按照我们之前的想法
青蛙3号有哪些去处呢
S柱子显然是不行了 因为它的号大
Y是可以的 右边的R也是可以的
到底要不要蹦到R上去呢
根据题目要求
一旦蹦过去 那就过去三只青蛙
它是最大的 摞在最底下
因此 根据前面讲过的思路
3号青蛙蹦到荷叶Y上去是合适的
3号青蛙就到荷叶上去了
4号青蛙就冒出来了
那他没有别的地方可以去
荷叶上落不上脚 小溪的柱子上s也落不上脚
4号青蛙直接从L蹦到R上去
那其实问题答案已经出来了
5号青蛙不可能过去 按照题目的要求一个摞一个
它比谁都大
Y上面是一个3号青蛙
S这一根柱子上面上面落了两只青蛙 1号跟2号
所以5号过不去
所以实际上当4号过到R上去的时候
问题已经到此为止啦
剩下的步骤只是要把小溪当中荷叶和柱子上的3只青蛙
怎么弄到R上面去
这个就比较简单 只需要依次往上蹦就可以了
不过呢 你发现当3号青蛙从荷叶蹦到右边R上面
的4号青蛙之上之后
这个柱子上的1号和2号青蛙
还不能一次性地蹦到右边的柱子上去
不过好在荷叶已经空出来了
所以这个时候我们要再次使用荷叶
要把S这个柱子作为出发点
让青蛙蹦到荷叶上去
然后最后到R这个柱子上去
所以 1号青蛙蹦荷叶 2号青蛙蹦到R柱子
最后1号青蛙从荷叶蹦到右边的柱子上去
所以这个时候我们可以看到在分析的过程中
在S柱子上面 中间状态时候
我们发现 它有1号青蛙和2号青蛙
在借助荷叶转移过去的时候 里头摞了两只青蛙
而此时此刻
右边的柱子 荷叶上的青蛙刚刚蹦过去
我们那上面也落着两个青蛙
这个时候一眼看过去
你就感觉好像是那两个柱子一共摞了4只青蛙
好像是两个小队一样 分为两部分
把原来L柱子上的1234号青蛙拦腰截断
分成两组 一组到了小溪当中的柱子上去
一组到了右边的R柱子上去
这样的过程实际上是一分为二的过程
也就是将L上的青蛙分成两队
这四只青蛙是怎么过去的呢
好像是分成了两组 4只青蛙每组两只
先把上面的一组送到S上去
再把剩下的一组送到R上去
这样呢我们就可以考虑
有荷叶一片 有柱子一根
以及L跟R这4个物体
实际上可以把它分成两个系统 两个区域
这是问题的关键
把它分成两个区域
第一个区域是为了把3号4号挪到右边的R上
还有个区域是把1号2号挪到S柱子上去
而我们刚才挪到S柱子上的时候
实际上利用了Y这个荷叶
大家想一想那个1号2号怎么过去的
2号先蹦过去 1号蹦荷叶 2号蹦S柱子
然后再把1号从荷叶蹦到S柱子上去
是这么一个过程
所以L和荷叶Y 和柱子S他们整个是一个整体
然后前面3号跟4号是蹦到R上面去
怎么过去的呢 是经过L Y R过去的
另外 1号2号怎么过到R上去呢
它又是借助Y这个荷叶 也就是S Y R又是一个过去的
那么我们可以画一个图
最开始L Y S一起运过一批青蛙到S上面去
第二个圈是L Y R 把3号4号运过去
最后我们发现1号2号到R上面去
是S Y R来过去的
也就是 L Y S作为一个整体
完成了上一半青蛙的转移
而L Y R完成了把L上面的下一半青蛙
挪到R上去这样一个任务
那么S Y R完成了把以前挪到S上面那一组青蛙
也就是青蛙的上一半 那一队伍前面的那些
移到R上面去
所以对于前面的L Y S系统来讲
它相当于一片荷叶
那么得到的青蛙数量实际上是Jump(0,1)
同理 从S经过Y到R上面去也相当于是Jump(0,1)
所以这两个系统
各自完成了一半的青蛙转移
所以呢 我们就得到
Jump(1,1)是通过两个系统
一边走了两只青蛙 一边走了另外两只青蛙
所以就变成了两倍的Jump(0,1)
所以是2*2=4 Jump(0,1)是2
-1.1 基础知识
-1.2 买菜问题
-1.3 数学运算
-1.4 补充说明
-1.5 总结
--1.5 总结
-程设论道
--程设论道
-师生问答
-第一章 编程初步--语法自测
-2.1 关于超级计算器的几点思考
-2.2 电子秤模拟 — 背景介绍及需求分析
-2.3 电子秤模拟 — 代码实现
-2.4 变量定义与变量类型
-2.5 猜数游戏与数据表示
-2.6 关于变量的讨论
--公告
-2.7 变量体现的计算思维
-程设论道
--程设论道
-师生问答
--师生问答
-第二章 变量与代数思维--语法自测
-3.1 谁做的好事——语义表示
-3.2 谁做的好事——真假检查
-3.3 谁做的好事——循环枚举
-3.4 谁是嫌疑犯——多重循环枚举
-3.5 谁是嫌疑犯——破案线索表示
-3.6 谁是嫌疑犯——用二进制枚举
-程设论道
--程设论道一
--程设论道二
--程设论道三
-师生问答
-第三章 逻辑推理与枚举解题--语法自测
-4.1 插花游戏
-4.2 筛法
-4.3 线性查找
-4.4 折半查找
--4.4.1 提问
-4.5 排序问题
-4.6 总结
--4.6.1 总结
-程设论道
--程设论道二:筛法
-师生问答
-第四章 筛法与查找--语法自测
-5.1 阶乘
-5.2 排序
-5.3 矩阵填充
-5.4 分书与八皇后
-5.5 青蛙过河
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答一
--师生问答二
-第五章 分治思想与递归--语法自测
-6.1 兔子数列问题
-6.2 分鱼问题
-6.3 橱窗的插花问题
-6.4 最长公共子序列问题
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第六章 递推与动态规划--语法自测
-7.1 统计记录总数
-7.2 统计活跃用户数
-7.3 统计在线时长
--7.3.2 结构
-7.4 总结
--7.4.1 总结
-程设论道
--程设论道
-师生问答
--师生问答
-第七章 文本数据处理--语法自测
-8.1 将数据组织成链表
-8.2 提高链表访问效率 —— 哈希链表
-8.3 以二进制文件存储链表
-程设论道
--程设论道一
--程设论道二
-师生问答
--师生问答
-第八章 非文本数据处理--语法自测
-9.1 自动售卖程序
-9.2 配制水果信息
-9.3 指定界面语言
-程设论道
--程设论道
-师生问答
--师生问答
-第九章 可配置的程序设计--语法自测