累了吗?来挑战一下算法趣题,看看本身是哪一个段位的程序猿吧!

 在这个突飞猛进的互联网时代中,但万变不离其宗的是,“算法”是其重要基石。要编写高效率的程序,就须要优化算法。不管开发工具如何进化,熟识并能灵活运用算法仍然是对程序员的基本要求。程序员

这里为那些已经学习过排序、搜索等知名算法,并想要学习更多有趣的算法,进一步提高编程技巧的工程师们准备了四道数学谜题形式的问题。这四道趣题分青铜、黄金、铂金,钻石级别。算法

在挑战以前,先介绍下问题的具体形式:编程

每一个问题大体分为“答案”和“解析”两部分。工具

请各位先通读问题描述,并动手编写程序尝试解题。在这个过程当中,具体的实现方法是其次,更重要的是思考“经过哪些步骤来实现才可以解决问题”。post

每一个问题都有思路讲解和源代码示例。请留意本身编程时在处理速度、可读性等方面进行的优化,和本文的源代码示例有什么不一样。若是事先看了思路讲解和答案,就会失去解题的乐趣,因此这里建议你们先编程解题,再看讲解。学习

为了你们更好的享受解题乐趣,把“答案”和“解析”放在了最后。开发工具

你准备好接招了吗?优化

 

Q1:倔强青铜3d

尝试用编程解决问题htm

 

难度系数:★

优秀的扫地机器人

(IQ:80    目标时间:20分钟)

如今有不少制造商都在卖扫地机器人,它很是有用,能为忙碌的咱们分担家务负担。不过咱们也很难理解为何扫地机器人有时候会反复清扫某一个地方。

假设有一款不会反复清扫同一个地方的机器人,它只能先后左右移动。举个例子,若是第1 次向后移动,那么连续移动3 次时,就会有如下9 种状况(如图 )。又由于第1 次移动能够是先后左右4 种状况,因此移动3 次时所有路径有9×4 = 36 种。

※ 最初的位置用0 表示,其后的移动位置用数字表示。

(移动路径事例)

问题:求这个机器人移动12 次时,有多少种移动路径?

(ps:最初三次的移动方向很自由,从第四次开始,坐标有些方向就不能移动啦)

 

Q2:荣耀黄金

解决简单问题体会算法效果

难度系数:★★

朋友的朋友也是朋友吗

(IQ:90    目标时间:25分钟)

“六度空间理论”很是有名。大概的意思是1 我的只须要经过6 个中间人就能够和世界上任何1 我的产生间接联系。本题将试着找出数字的好友(这里并不考虑亲密指数)。

假设拥有一样约数(不包括1)的数字互为“好友”,也就是说,若是两个数字的最大公约数不是1,那么称这两个数互为好友。

从1~N 中任意选取一个“合数”,求从它开始,要经历几层好友,才能和其余全部的数产生联系(所谓的“合数”是指“有除1 以及自身之外的约数的天然数”)。

举个例子,N = 10 时,1~10 的合数是四、六、八、九、10 这5 个。

若是选取的是10,那么10 的好友数字就是公约数为2 的四、六、8这3 个。而9 是6 的好友数字(公约数为3),因此10 只须要通过2 层就能够和9 产生联系(如图 )。若是选取的是6,则只需通过1 层就能够联系到四、八、九、10 这些数字。所以N = 10 时,不管最初选取的合数是什么,最多通过2 层就能够与其余全部数产生联系。

(N=10的时候)

问题: 求从1~N 中选取7 个合数时,最多通过6 层就能够与其余全部数产生联系的最小的N。

 

Q3:尊贵铂金

优化算法实现高速处理

难度系数:★★★

优雅的IP 地址

(IQ:100    目标时间:30分钟)

可能大部分读者都清楚,IPv4 中的IP 地址是二进制的32 位数值。不过,这样的数值对咱们人类而言可读性比较差,因此咱们一般会以8 位为1 组分割,用相似192.168.1.2 这种十进制数来表示它。

 

 

(IP地址 IPv4)

这里,咱们思考一下十进制数0~9 这10 个数字各出现1 次的IP 地址(像正常状况同样,省略每组数字首位的0。也就是说,不能像192.168.001.002 这样表示,而要像192.168.1.2 这样来表示)。

 

问题: 求用二进制数表示上述形式的IP 地址时,能使二进制数左右对称的IP 地址的个数(用二进制数表示时不省略0,用完整的32 位数表示)。 (ps:IPv4的IP地址用十进制表示时,以点号分割的各部分数字都在0~255这个范围内。能够经过求“比特列为8位且左右对称”的数值,并将其设置在以点号分割的各部分上来解题。)

 

Q4:永恒钻石

改变思路让程序速度更快

难度系数:★★★★

异性相邻的座次安排

(IQ:130    目标时间:60分钟)

回想起学生时期调座位的时候,咱们的内心老是会小鹿乱撞。想必不少人都对谁会坐本身旁边这件事莫名地激动吧?

这里咱们考虑一种“先后左右的座位上必定都是异性”的座次安排。也就是说,像图右侧那样,先后左右都是同性的座次安排是不符合要求的(男生用蓝色表示,女生用灰色表示)。(座位安排示例)

问题: 假设有一个男生和女生分别有15 人的班级,要像图26 那样,排出一个6×5的座次。求知足上述条件的座次安排共多少种(先后或者左右镜像的座次也看做不一样的安排。另外,这里不在乎具体某个学生坐哪里,只看男生和女生的座次安排)? (ps:剪枝能够有效的缩小搜索范围哦)

~~~~~~~~~~~~~~~~~~~~~~~~~华丽丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~

使人激动的答案来啦~

Q1答案:324932

详细解析:用坐标(0, 0) 表示最初的位置。从这个原点开始,避开已经走过的坐标,使机器人前进。用深度优先搜索就能够实现逻辑,如图所示。

 

 

Q2答案:55(知足条件的组合为:【4,26,39,55,35,49】)

详细解析:要解决这个问题,首先要正确理解问题中出现的词。首先是“合数”。

其次是“公约数”这个词。小学的时候,咱们就作过求最大公约数的题。公约数的意思就是“共同的约数”。这里,拥有共同约数的数字互为“好友”,那么就须要求最大公约数非1 的状况。

从1~N 中选取7 个合数,且“最多通过6 层”,那么能够得知,咱们要找的是“由2 个数相乘获得的数字”的组合。这样的话,乘法运算中的这2 个数就会成为公约数。

举个例子,选出a~h 这些数。简单地说就是,当7 个数字分别是如下的形式时,通过6 层就能与其余全部数产生联系。

a × b, b× c, c× d, d × e, e × f, f× g, g ×h

※这里a~h 这些数字必须“互质”。

更进一步考虑,也能够像本题中的例子同样,把第1 个数字设置成“平方数”(即4),也就是说变成下面这样的组合更好。

a × a, a × b, b × c, c × d, d × e, e × f, f × g

末尾若是一样设置成平方数就会变得更小,也就是变成下面这样的组合。

 a × a, a × b, b × c, c × d, d × e, e × f, f × f 

 用Ruby 能够如图实现。

 

Q3答案:8个
详细解析:按照题意,用十进制数表示时要使用0~9 这10 个数字各1 次,那么最高位是除0 之外的9 种状况,而其余各个数位可分别使用0~9 这10个数字各1 次,其排列组合一共9!(9 的阶乘)种,因此总共要遍历9×9! 种,也就是3265920 种状况。

要想求左右对称的二进制数,能够经过把16 位的二进制数逆序排列,并将结果与该16 位的二进制数自己拼合,即生成32 位数来求得。由于是16 位,因此全量搜索时只须要遍历65536 种状况便可。

而后,把这个二进制数转换成十进制数,分别使用0~9 这10 个数字各1 次便可。

 

用Ruby 实现时,代码如图 所示。

相关文章
相关标签/搜索