还是用的67题的暴力组合的方法,看到有题解用的递归函数来计算多次运算,这个思路也很好,可以计算更多张牌的组合,如果用for循环就落入俗套了。

有几个细节需要注意:

1、如果需要使用一个列表的数据,并且要修改数据,而且又不影响源数据,这就需要切片,而不能直接使用赋值,因为赋值只是创建一个新的引用,二者是共用内存地址的,这样会改此动彼。

2、remove()方法只会移除遇到的第一个元素

3、需要强制从左到右计算,可以用eval和小括号组合实现

#这道题才能算得上【较难】,是67和88题的组合题目
#Tips:
#remove函数只会移除一个列表元素
#对于需要改动列表但是又不想影响原来的列表的情况,需要用切片

#思路:
#先按照权值转换为数字,再计算4个数字是否能产生24点
#这道题的限制条件也很多,对做题人来说很有利


a=input().split()
std1="3 4 5 6 7 8 9 10 J Q K A 2".split()
std2="3 4 5 6 7 8 9 10 11 12 13 1 2".split()

def check(a):
    #特判大小王
    if "joker" in a or "JOKER" in a:
        return "ERROR"

    for i in range(len(a)):#转为数字
        a[i]=std2[std1.index(a[i])]
    # print(a)

    #开始计算24点
    for i in a:#挑选第一个数字
        temp=a[:]
        temp.remove(i)
        b=temp#得到挑选之后剩下的列表
        for j in b:
            temp=b[:]
            temp.remove(j)
            c=temp
            for k in c:
                temp=c[:]
                temp.remove(k)
                d=temp[0]#最后一个数字

                #遍历操作符
                for l in ["+","-","*","//"]:
                    for m in ["+","-","*","//"]:
                        for n in ["+","-","*","//"]:
                            # print(i+l+j+m+k+n+d.replace("//","/"))
                            if eval("(("+i+l+j+")"+m+k+")"+n+d)==24:
                                #从数字换回牌
                                i=std1[std2.index(i)]
                                j=std1[std2.index(j)]
                                k=std1[std2.index(k)]
                                d=std1[std2.index(d)]
                                a=i+l+j+m+k+n+d
                                ans=a.replace("//","/")
                                return ans
    return "NONE"
print(check(a))