程序员的算法趣题Q56: 鬼脚图中的横线(思路1)
目录
1. 问题描述
2. 解题分析
2.1 贪心策略
3. 代码及测试
4. 后记
1. 问题描述
2. 解题分析
感觉非常没有头绪。先做一些实例计算分析。
2.1 贪心策略
考虑图1的{1234--3421}的例子。为了说明方便,以U*表示上边的数字,D*表示下边的数字。以“纵1”表示第一根纵线,余类推。以”横*”表示所添加的横线,横线上的数字(图中8边形中的数字)表示横线添加的序号。
假定按照类似于贪心算法的方式来绘制鬼脚图。
比如说U1要到达D1,必须横跨中间两根纵线,因此可以画出对应的横线如下图所示:
接下来考虑U2àD2. U2往下走时先碰到横1横跨到纵1,然后肯定必须再加一根横线回到纵2。但是这根横线添加的(相对于其它已经添加的横2、3的)纵向相对位置是与后续动作相关的,所以必须分情况考虑。显然这里有三种可能的情况,如下所示:
上图中的(2.1)由于横4的加入导致原来的U1到D1的路径发生了变化,所以予以排除(注1:暂时按照这种规则进行)。
图(2.2)中U2经过横1、横4后回到纵2,然后需要再添加一条横线到达D2,同样有相对于横3的上下相对位置的两种选择。但是如果添加到横3上面(横4与横3之间)的话,会导致原U1到D1的路径发生变化所以排除(2.2.1)。因此只有一种选择,如下图所示(2.2.2):
接下来继续考虑(2.2.2),我们会发现在(2.2.2)中U3和U4已经可以借助既有横线到达目的点了:U3-横2-横4;U4-横3-横5。因此我们得到{1234--3421}的第一个鬼脚图解。
接下来再回头考虑(2.3)的继续。U2要到到达D2还要追加一条线,由于横4已经比横3低了,所以追加横5只有一种可能。如下图所示:
然后我们同样发现,在(2.3.1)中U3和U4已经可以借助既有横线到达目的点了:U3-横2-横4-D3;U4-横3-横5-D4。因此我们得到{1234--3421}的第二个鬼脚图解。
以上我们基于类似于贪心算法的思路得到了{1234--3421}的两个鬼脚图解。但是这里存在几个问题:
- 如何确保,或者说如何证明,以上贪心算法总能得到最优解?
- 以上鬼脚图绘制规则由人手动来做的话似乎是一目了然的,但是如何让计算机按照这个规则来搜索呢,或者说如何编程呢?
试图总结以上鬼脚图绘制贪心策略如下(CSDN上不能很好地支持WORD复制过来的自动缩进所以只好贴图):
以上可以看作是一个基于贪心策略的深度优先搜索问题。虽然前进了一步,但是依然没有解决前面提及的两个问题:如何证明最优性或非最优性?如何编程?甚至,以上规则难以显而易见地判断是正确的。。。不过作为一种思路记录下来总归是有价值的
3. 代码及测试
4. 后记
[2021-11-05] 非常惭愧,这道题目从最开始看到过去了两个星期。但是一直没有找到明确的头绪,所以暂时先把到目前为止的思路列上。欢迎小伙伴们讨论指点。不过我还没有放弃(还没有想去偷看原书答案),还是希望自己能够找到一个属于自己的(哪怕笨拙)解决方案^-^毕竟现实生活中的问题并不总是有答案可以参考的。
[2021-11-08] 本问题的第2个思路参见:程序员的算法趣题Q56: 鬼脚图中的横线(思路2)https://blog.csdn.net/chenxy_bwave/article/details/121212455https://blog.csdn.net/chenxy_bwave/article/details/121212455
上一篇:Q55: 平分蛋糕
下一篇:Q57: 最快的联络网
本系列总目录参见:程序员的算法趣题:详细分析和Python全解
程序员的算法趣题Q56: 鬼脚图中的横线(思路1)相关推荐
- 程序员的算法趣题Q56: 鬼脚图中的横线(思路2的Python题解)
目录 1. 问题描述 2. 实现方案 3. 代码实现 4. 后记 1. 问题描述 问题描述以及此前的讨论参见: 程序员的算法趣题Q56: 鬼脚图中的横线(思路1)https://blog.csdn.n ...
- 程序员的算法趣题Q56: 鬼脚图中的横线(思路2)
目录 1. 问题描述 2. 思路2 2.1 从鬼脚图出发进行变形 2.2 反向变换 2.3 进一步探索 3. 小结 1. 问题描述 问题描述以及关于本问题的第一个思路参见:程序员的算法趣题Q56: 鬼 ...
- php算法求出一个数可以被分解成多少个_程序员的算法趣题
计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...
- 程序员的算法趣题Q55: 平分蛋糕
目录 1. 问题描述 2. 解题分析 2.1 初始算法流程 2.2 优化 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 这个题目第一感就是动态规划. 对于(m, n)形状(如下图所示, ...
- 程序员的算法趣题Q57: 最快的联络网
目录 1. 问题描述 2. 解题分析 2.1 学生的状态 2.2 学生状态转移 Case-T1:Do nothing, just wait Case-T2:给处于S0状态的学生打电话 Case-T3: ...
- 程序员的算法趣题Q66: 设计填字游戏
目录 1. 问题描述 2. 解题分析 2.1 基本算法流程 2.2 连通性检查 3. 代码及测试 4. 后记 1. 问题描述 2. 解题分析 与前面的Q32.Q59以及后面的Q68(碰巧先做了Q68) ...
- LeetBook《程序员的算法趣题》Q18---水果酥饼日
<程序员的算法趣题>-(日)增井敏克 , 书中为69 道数学谜题编写了解题程序, 编程语言为:Ruby,JavaScript,C语言. Q18 水果酥饼日 日本每月的 22 日是水果酥 ...
- 程序员的算法趣题Q50: 完美洗牌
目录 1. 问题描述 2. 解题分析 2.1 思路1 2.2 思路2 3. 代码及测试 4. 后记 1. 问题描述 问题:对2n张牌洗牌,并求当1<=n<=100时,一共有多少个n可以使得 ...
- 程序员的算法趣题Q09: 落单的男女
目录 1. 问题描述 2. 解题分析 3. 代码及测试 4. 思考 1. 问题描述 人们聚集在某个活动会场上,根据到场顺序排成一排等待入场,活动的主办人员,想把人们从队列的某个位置分成两组,想要让分开 ...
最新文章
- SAP RETAIL初阶之商品主数据WM视图
- DataSet RecordSet 互转
- 【STM32】窗口看门狗
- TimerTask定时任务
- ext4 关闭延迟分配
- mysql 外键和事务,MySQL-约束和事务
- SQL Server 2017:mTVF的交错执行
- warning C4819: The file contains a character that cannot be represented in the current code page
- Android学习资源网站 1
- Oracle书籍推荐
- ARM 汇编基础教程系列
- 普通高中信息技术课程标准( 必修 选修科目)
- k8s基本概念及使用
- 6步教你zencart模板制作
- 《树莓派项目实战》第五节 使用Nokia 5110液晶屏显示Hello World
- 动一行,修半年,我的代码八代单传
- 交集♂差集♂并集♂和其他集合的内置方法
- java 包别名_包别名(Package Aliasing)
- 电脑用js调用QQ客服聊天 阿星小栈
- 解决:IEDA在plugins里搜不到mybatisx插件