还是用的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))

京公网安备 11010502036488号