题解 | #24点运算#

24点运算

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

'''思路:
1. 获取四张数字牌的全排列
2. 对每一种全排列计算遍历所有可能的表达式
Tip:可以根据24在所有表达式遍历结果list中的index判断每一步都做了什么运算,从而不用在计算中保留计算方式
'''

l = 4
visited = [False]*l
s = [0]*l
allS = []
flag = 0
# dfs全排列
def allSort(pos): # i:元素为int的list
    if pos == l:
        allS.append(s.copy())
        return 
    else:
        for i in range(l):
            if not visited[i]:
                visited[i] = True
                s[pos] = li[i] # !不pop,只修改
                allSort(pos+1)
                visited[i] = False

# 处理输入
inp = input().split()
d = {
    'J': 11,
    'Q': 12,
    'K': 13,
    "A": 1,
}
d_ = {
    11: 'J',
    12: 'Q',
    13: 'K',
    1: 'A'
}
if 'joker' in inp:
    print('ERROR')
    exit()

for i in range(4):
    if inp[i] in d:
        inp[i] = d[inp[i]]
li = list(map(int, inp))
allSort(0)

def ope(a, b):
    # print(a,b)
    tmp = []
    tmp.append(a+b)
    tmp.append(a-b)
    tmp.append(a*b)
    tmp.append(a//b)
    return tmp

 # 根据24的下标求表达式,ope_n表示第n次运算
def getExp(ind, nums):
    ope3 = ind%4
    ope2 = ind//4%4
    ope1 = ind//16
    opes = ['+', '-', '*', '/']
    for i in range(4):
        if nums[i] in d_:
            nums[i] = d_[nums[i]]
    return str(nums[0])+opes[ope1]+str(nums[1])+opes[ope2]+str(nums[2])+opes[ope3]+str(nums[3])


for nums in allS:
    l1 = ope(nums[0], nums[1])
    l2 = []
    for i in l1:
        l2.extend(ope(i, nums[2]))
    l3 = []
    for i in l2:
        l3.extend(ope(i, nums[3]))
    try:
        ind = l3.index(24)
        print(getExp(ind, nums))
        flag = 1
        break
    except:
        continue

if not flag:
    print('NONE')

全部评论

相关推荐

11-08 16:53
门头沟学院 C++
投票
滑模小马达:第三个如果是qfqc感觉还行,我签的qfkj搞电机的,违约金也很高,但公司感觉还可以,听说之前开过一个试用转正的应届生,仅供参考。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务