【Python代码】给定正整数,在+-*/的情况下,算法实现24点游戏,计算所有的可能

版权声明:博客仅供参考,有什么意见,请在下方留言,转载时请附上链接,谢谢! https://blog.csdn.net/u010105243/article/details/83118839

下面回顾一下前两天面试过程中,做的一到笔试题:
题目:计算24 点,输入4 个整数,如何计算得到24,输出所有可能的计算方式; 若不能计算得到则输出None。

解题思路:由于不考虑顺序, 括号的位置可以认为有两种[(a, b, c) d ]; [(a,b), (c,d)],然后递归地遍历所有的情况。里面有两个小点:
(1) a+b和b+a的情况一样,可以去掉一部分的计算
(2) 主函数中考虑到浮点计算,中间有一个判断。
代码如下:

#!/usr/bin/python
from __future__ import division
#Author: Marlin
#Time: 2018-10-15

def permutation(items, n=None):
    if n is None:
        n = len(items)
    for i in range(len(items)):
        v = items[i:i + 1]
        if n == 1:
            yield v
        else:
            rest = items[:i] + items[i + 1:]
            for p in permutation(rest, n - 1):
                yield v + p


def F(a, b):
    arr = []
    for i in a:
        for j in b:
            arr.append("(" + i + "+" + j + ")")
            arr.append("(" + i + "-" + j + ")")
            arr.append("(" + j + "-" + i + ")")
            arr.append("(" + i + "*" + j + ")")

            eval(j) != 0 and arr.append("(" + i + "/" + j + ")")
            eval(i) != 0 and arr.append("(" + j + "/" + i + ")")
    return arr


def main(arr):
    vaild_exprs = []
    for lst in permutation(arr):
        a_expr = F(F(F([lst[0]], [lst[1]]), [lst[2]]), [lst[3]])

        b_expr = F(F([lst[0]], [lst[1]]), F([lst[2]], [lst[3]]))
        all_expr = a_expr + b_expr
        for expr in all_expr:
            if abs(eval(expr) - 24) < 0.0001:
                vaild_exprs.append(expr)
                print(expr)
    print('None' if len(vaild_exprs) == 0 else 'Total:{}'.format(len(vaild_exprs)))


if __name__ == '__main__':
    # sample = [3, -12, 3, 0]
    # sample = [3, -12, 7, 1]
    sample = [1, 7, 3, 8]
    arr = [str(i) if i >= 0 else '('+str(i)+')' for i in sample ]
    main(arr)

代码仅供内部交流

猜你喜欢

转载自blog.csdn.net/u010105243/article/details/83118839