题解 | #24点运算#

24点运算

http://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d

用了python的itertools库里的permutatios来生成四个数字的全队列,不能加括号这个有点坑,直接用eval不行,具体的都写在代码的注释里面了。

a = '2 3 4 5 6 7 8 9 10 J Q K'.split()#生成d这个字典让牌和数字一一对应
d = {}
for i in range(len(a)):
    d[a[i]] = str(i+2)
d['A'] = '1'                         
card = input().split()
if 'JOKER' in card or 'joker' in card:#如果有大小王就不往下进行了,直接报错
    print('ERROR')
else:
    tmp = [] #将四张牌对应的数字写进tmp
    for i in range(4):
        tmp.append(d[card[i]])
    ans = 'NONE'
    arr = []
    for i in itertools.permutations(tmp):#生成arr,即四个数字的全排列
        arr.append(i)
    for i in ['+','-','*','/']:#四个数字运算中间总共有三个符号,用ijk来表示,遍历每一种可能
        for j in ['+','-','*','/']:
            for k in ['+','-','*','/']:
                for z in set(arr):
                    if  eval(str(eval(str(eval(z[0]+i+z[1]))+j+z[2]))+k+z[3])== 24:#此处注意不能直接eval整个式子,因为运算过程是按每两个数字从左往右依次进行的,而不会因为乘除优先级高而先进行乘除
                        ans = z[0]+i+z[1]+j+z[2]+k+z[3]
                        break
                if ans != 'NONE':#ans改变即找到了答案 一路break出去
                    break
            if ans != 'NONE':
                break
        if ans != 'NONE':
                break
    if ans != 'NONE':
        realans = [0]*4          #real answer 将ans中的数字变成牌
        for key,value in d.items():
            if value == z[0]:
                realans[0] = key
            if value == z[1]:
                realans[1] = key
            if value == z[2]:
                realans[2] = key
            if value == z[3]:
                realans[3] = key
        print(realans[0]+i+realans[1]+j+realans[2]+k+realans[3])#最终的表达式
    else:
        print(ans)          #没找到就输出 NONE
全部评论

相关推荐

点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务