算法:计算24点

风行水上 @ 2010-06-13 15:51:33
标签:

    两个数值之间计算表示为s = f(a,b),这可能有六种情况:

    • a+b
    • a-b
    • b-a
    • a*b
    • a/b
    • b/a

    对于三个数值之间的可能计算

    多于两个数的情况,先考虑三个数的情况

    F(a,b,c) = f(a, f(b,c)) 或者 f(f(a,b), c) 或者 f(f(a,c), b))

    四个数的情况一样可以最终分解为一系列两个数的f(a,b)运算,只是不同的分解方法的可能性会更多。而这也正是比较关键的地方。

    再回头仔细考察三个数的情况,其实本质上这里可以概括为两种情况: 任取三个数中的一个数,假定为 a,

    • 可以通过交换律与其他数字进行运算,比如 b+a-c,可以分解为 f(f(a,b),c) 或者 f(f(a,c),b)
    • 只能通过分配律或者结合律与其他数字进行运算,比如 a*(b+c) 或者 a + (b - c),可以分解为 f(a,f(b,c))

    而对于 f(a,f(b,c)) 可以转化为 f(f(b,c), a),这与 f(f(a,b), c) 和 f(f(a,c),b) 同构。因此,问题的关键就变成如下两个问题:

    1. 构建一个可以处理 f(f(a,b),c)的递归运算
    2. 构建一个从f(a,f(b,c)) 到 f(f(b,c),a)的转换

    这种方式应该能够遍历所有可能的计算结果。对于计算24点来说,就是将每个可能的结果与24进行比对。

    在已知计算结果S(比如 S=24)这样的情况下也可以有另一种处理方法。

    S = F(a, b, c) = f(a, f(b,c)) = f(f(a,b), c)

    S = f(f(a,b), c) 与前述情况相同。

    S = f(a, f(b,c)) 可以变形为 f(S,a) = f(b,c)

    相关资源

    标签:

      分享到:
      comments powered by Disqus

      26/29ms