HJ89 24点运算 用递归生成器进行数列穷举

思路:

1、对4张牌进行全排序,并输出列表

2、分别对排序进行计算尝试,采用穷举方式

3、返回结果

除了用递归生成器进行数组全排序外,也用模块from itertools import permutations,进行全排序。

 1 #输出算式运算顺序从左至右运算,不需要括号确定优先级。
 2 
 3 #列举所有排序方式,比如 1234,1324......
 4 def relist(a):#用递归生成器返回不重复顺序的列表
 5     if len(a)==1:
 6         yield a
 7     for i in range(len(a)):
 8         for j in relist(a[:i]+a[i+1:]):
 9             #print( a[i],j)
10             yield [a[i]]+j   

12 def twentyfour(a):#采用多重循环对数组a所有计算方式穷举。
13     operator=['+','-','*','/']
14     for i in operator:
15         for j in operator:
16             for n in operator:
17                 if dop[i](dop[j](dop[n](a[0],a[1]),a[2]),a[3])==24:
18                     return a,n,j,i
19 import operator
20 dop={'+':operator.add,'-':operator.sub,'*':operator.mul,'/':operator.truediv}
21 d={'J':11,'Q':12,'K':13,'A':1}
22 a=input().split()
23 b=a.copy()
24 flag=0
25 for k,i in enumerate(a):
26     if i.isdigit():
27         a[k]=int(i)
28     elif i in d:
29         a[k]=d[i]
30     else:
31         print("ERROR")
32         flag=1
33 #用flag使当输出”ERROR"不再进行后面运算,用flag1,输出NONE.
34 if flag==0:
35     flag1=0
36     for i in relist(a):
37         #print(i)
38         new=[]
39         if twentyfour(i):
40             temp,n1,n2,n3=twentyfour(i)
41             for i in temp:
42                 for k,j in enumerate(a):
43                     if i==j:                             #查表打印特殊字符JQKA
44                         new.append(b[k])
45                         break
46             tem=str(new[0])+n1+str(new[1])+n2+str(new[2])+n3+str(new[3])
47             print(tem)
48             flag1=1
49             break
50     if flag1==0:
51         print('NONE')

 

posted @ 2023-05-01 17:00  Aneverforget  阅读(41)  评论(0编辑  收藏  举报