24点游戏是一款老少咸宜的益智游戏,游戏的玩法是给出任意四个数字,通过加减乘除四则运算,计算出24。
网上有很多24点游戏算法,找出解法并不难,但是难在如何合适地加括号和去除等价的重复表达式上。
1. 目标和要求
我们的目标是给定任意N个正整数(N > 1),找到能够将这N个数通过四则运算计算得出24的全部表达式,并且只在必要的时候加上括号以及去除等价的重复表达式。
首先,我们要明确什么是合适的括号?就是指在不影响计算结果的前提下,能不加括号尽量不加括号,比如:
(15 + 8) + 7 -6 = 24 应写作 15 + 8 + 7 -6 = 24
其次,什么是等价的重复表达式呢?就是完全相同的表达式,或者是在加法交换率和乘法交换率的作用下,完全等价的表达式。比如:
10 + 12 + 7 - 5 = 24 等价于 10 - 5 +7 + 12 = 24
15 * 8 / (1 + 4) = 24 等价于 15 / (4 + 1) * 8 = 24
(3 + 1) * (2 + 4) = 24 等价于 (1 + 3) * (4 + 2) = 24
2. 算法
2.1. 求全部解算法
我采用的算法是降低维度的算法,即把多维问题降低到二维来解决。
比如,给定四个数字[1, 2, 3, 4],这是一个四维问题,我们首先要将其转换为二维问题。具体的办法是,先将四个数字其中的两个数字取出,然后将这两个数字转化为所能组成的全部表达式。
我们首先取出[1, 2],考虑到加法交换率和乘法交换率的前提下,共有6种可能的不等价表达式,即1+2, 1-2, 1*2, 1/2, 2-1, 2/1,则四维问题就可以转化为多组三维问题,即['1+2', 3, 4],['1-2', 3, 4],['1*2', 3, 4], ['1/2', 3, 4], ['2-1', 3, 4], ['2/1', 3, 4]。
然后我们穷尽每一种取出两个数的组合,使用排列组合公式即C(4, 2),所以将四维问题转化为三维问题共有C(4, 2) * 6 = 36种组合。
下一步是重复这一过程,将三维问题继续转化为二维问题,同理,每一个三维问题都可转化为等价的二维问题,共有C(3, 2) * 6 = 18种组合。
所以,四维问题可转化为36 * 18 = 648种二维问题,每个二维问题又有