目录

​70 跳跃成对1​

​71 标记方格1​

​72 标记方格2​

​73 逮公鸡​

​76 高效的车​

​78 直三格板平铺​

​80 王子之旅​

​81 再论名人问题​

​84 煎饼排序​

​85 散步谣言1​

​86 散步谣言2​

​87 倒置的玻璃杯​

​88 蟾蜍和青蛙​

​90 座位重排​

​91 水平的和垂直的多米诺骨牌​

​92 梯形平铺​

​93 击中战舰​

​94 搜索排好序的表​

​95 最大-最小称重​

​96 平铺楼梯区域​

​97 topswops游戏​


70 跳跃成对1

算法谜题(70-100)_编程

算法谜题(70-100)_编程之美_02

71 标记方格1

算法谜题(70-100)_编程_03

算法谜题(70-100)_编程之美_04

72 标记方格2

算法谜题(70-100)_搜索_05

算法谜题(70-100)_编程_06

算法谜题(70-100)_编程之美_07

73 逮公鸡

算法谜题(70-100)_搜索_08

算法谜题(70-100)_搜索_09

算法谜题(70-100)_搜索_10

我认为参考答案的思路是对的,但是结果错了,14应该改成13,其他地方都不需要改。

76 高效的车

算法谜题(70-100)_编程之美_11

算法谜题(70-100)_编程之美_12

算法谜题(70-100)_搜索_13

78 直三格板平铺

算法谜题(70-100)_搜索_14

算法谜题(70-100)_编程之美_15

80 王子之旅

算法谜题(70-100)_编程之美_16

算法谜题(70-100)_搜索_17

其实如果n=3k+1的情况从左上角开始,那么3种情况就几乎是一样的了。

81 再论名人问题

算法谜题(70-100)_编程_18

算法谜题(70-100)_全排列_19

总结起来就是2个步骤,第1个步骤找出唯一可能是名人的人,需要n-1步,也就是每一步排除一个人

第2个步骤考虑这个人到底是不是名人,需要问其他n-1个人是否认识他,他是否认识其他n-1个人,一共需要2(n-1)-1步,减掉1是因为有一步和第1个步骤里面重复了。

84 煎饼排序

算法谜题(70-100)_编程_20

算法谜题(70-100)_全排列_21

这个翻的方法很简单,寥寥数语就已经说清楚了。至于在最糟糕的情况下所需要的翻转次数,此处略掉了(书上有,不过挺长的),很简单,就是2n-3

然而在编程之美上有个很难的问题,问,任意次序的n个烙饼翻排序所需的最小翻转次数是多少?

这个问题太难了,即使是n=14也是目前未解之谜。

85 散步谣言1

算法谜题(70-100)_全排列_22

算法谜题(70-100)_编程之美_23

还有一种思路,出现第一个知道所有谣言的人至少需要n-1步,唯一的方法就是接力

从出现第一个人开始,到所有人都知道所有谣言,也至少需要n-1步,唯一的方法也是接力

当然,接力的顺序不固定。

86 散步谣言2

算法谜题(70-100)_搜索_24

算法谜题(70-100)_全排列_25

算法谜题(70-100)_全排列_26

上面提到的文章,第一篇是Spreading gossip efficiently,内容如下:

算法谜题(70-100)_编程_27

——————————————————————————————————————————

算法谜题(70-100)_全排列_28

算法谜题(70-100)_编程_29

——————————————————————————————————————————

算法谜题(70-100)_编程之美_30

第2篇是Hard-to-Solve Math Puzzles by Derrick Niederman,我没找到免费阅读的地方。

87 倒置的玻璃杯

算法谜题(70-100)_编程之美_31

算法谜题(70-100)_搜索_32

88 蟾蜍和青蛙

算法谜题(70-100)_编程之美_33

算法谜题(70-100)_编程之美_34

算法谜题(70-100)_搜索_35

上述网站即​​Interactive Mathematics Miscellany​​ 

其中有2个网页,​​Toads And Frogs Puzzle​​​、​​Toads And Frogs Puzzle in 2D​

内容刚好可以对应我的2篇博客​37跳棋(4)​​​、​​28象棋(3)​

90 座位重排

生成全排列的Johnson–Trotter算法

算法谜题(70-100)_全排列_36

算法谜题(70-100)_搜索_37

91 水平的和垂直的多米诺骨牌

算法谜题(70-100)_编程之美_38

算法谜题(70-100)_搜索_39

92 梯形平铺

算法谜题(70-100)_编程之美_40

算法谜题(70-100)_全排列_41

93 击中战舰

算法谜题(70-100)_编程_42

算法谜题(70-100)_编程之美_43

94 搜索排好序的表

100 个不同的数字被写在 100 张卡片上, 每张卡片一个数字。卡片被排列成 10行10列, 在每一行 (从左至右) 每一列 (从上至下) 都是递增的顺序。每一张卡片都是面朝下的, 所以你看不见写在卡片上的数字是多少。现在请问你能不能设计一个算法, 使得你在翻动卡片次数小于 20 的情况下, 即可以确定一个给定的数字是否被写在其中的一张卡片上?

        答案: 首先从序列右上角的卡片开始翻, 然后将它的数字和正在搜寻的数字 进行对比。如果两个数字相等, 该问题就解决了。如果搜索的数字小于翻转卡片上 的数字, 那么, 搜索的数字不可能在最后一列, 因此可以移动到卡片左边相邻的列。 如果搜索的数字大于翻转卡片上的数字, 那么, 搜索的数字不可能处在第一行上, 因此可以移动到下面的一行。重复以上操作, 直到找到正在搜索的数字,或者搜索已经超出了边界条件, 至此, 问题就得以解决了。

        该算法翻卡片所产生的序列, 形成了一条锯齿线, 由序列的右上角向左或者向下到达某一卡片的片段构成。这样的最长曲线是在左下角结束的, 并且总共翻起了 19 张卡片。不可能存在更长的锯齿线了, 因为它不可能有超过 9 个水平的片段 和 9 个垂直的片段。

95 最大-最小称重

算法谜题(70-100)_搜索_44

算法谜题(70-100)_编程之美_45

96 平铺楼梯区域

​平铺楼梯区域​

97 topswops游戏

算法谜题(70-100)_编程_46

算法谜题(70-100)_全排列_47