在这个突飞猛进的互联网时代中,但万变不离其宗的是,“算法”是其重要基石。要编写高效率的程序,就须要优化算法。不管开发工具如何进化,熟识并能灵活运用算法仍然是对程序员的基本要求。程序员
这里为那些已经学习过排序、搜索等知名算法,并想要学习更多有趣的算法,进一步提高编程技巧的工程师们准备了四道数学谜题形式的问题。这四道趣题分青铜、黄金、铂金,钻石级别。算法
请各位先通读问题描述,并动手编写程序尝试解题。在这个过程当中,具体的实现方法是其次,更重要的是思考“经过哪些步骤来实现才可以解决问题”。post
为了你们更好的享受解题乐趣,把“答案”和“解析”放在了最后。开发工具
Q1:倔强青铜3d
尝试用编程解决问题htm
难度系数:★
优秀的扫地机器人
(IQ:80 目标时间:20分钟)
如今有不少制造商都在卖扫地机器人,它很是有用,能为忙碌的咱们分担家务负担。不过咱们也很难理解为何扫地机器人有时候会反复清扫某一个地方。
假设有一款不会反复清扫同一个地方的机器人,它只能先后左右移动。举个例子,若是第1 次向后移动,那么连续移动3 次时,就会有如下9 种状况(如图 )。又由于第1 次移动能够是先后左右4 种状况,因此移动3 次时所有路径有9×4 = 36 种。
※ 最初的位置用0 表示,其后的移动位置用数字表示。
(移动路径事例)
(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 这种十进制数来表示它。
这里,咱们思考一下十进制数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
Q3答案:8个
详细解析:按照题意,用十进制数表示时要使用0~9 这10 个数字各1 次,那么最高位是除0 之外的9 种状况,而其余各个数位可分别使用0~9 这10个数字各1 次,其排列组合一共9!(9 的阶乘)种,因此总共要遍历9×9! 种,也就是3265920 种状况。
要想求左右对称的二进制数,能够经过把16 位的二进制数逆序排列,并将结果与该16 位的二进制数自己拼合,即生成32 位数来求得。由于是16 位,因此全量搜索时只须要遍历65536 种状况便可。