24点游戏--python

leetcode 679 题

虽然写的超时了,但是答案都是准确的,超市是因为用了递归以及把所有情况都遍历了,也不想改了


思路就是构造后续表达式,先找出4个数的全排列,再构造表达式的全组合,然后构造后续表达式,这里应用了递归


可以做的优化:很多情况都是重复的,以及三个数的结果是0或者负数也可以直接排除,但本身的复杂度也不是很高


class Solution(object):
def judgePoint24(self, nums):
def get_result(order):
numbers = []
result = 0
for word in order:
if ord(word) > ord('0') and ord(word) <= ord('9'):
numbers.append(float(ord(word) - ord('0')))
else:
if word=='+':
n2 = numbers.pop(-1)
n1 = numbers.pop(-1)
numbers.append(n1 + n2)
if word == '-':
n2 = numbers.pop(-1)
n1 = numbers.pop(-1)
numbers.append(n1 - n2)
if word == '*':
n2 = numbers.pop(-1)
n1 = numbers.pop(-1)
numbers.append(n1 * n2)
if word == '/':
n2 = numbers.pop(-1)
n1 = numbers.pop(-1)
if n2 == 0:
return 0
else:
numbers.append(n1 / n2)

return int(numbers[0])

def get_symbol():
symbol_order = []
symbol=['+','-','*','/']
for s1 in symbol:
for s2 in symbol:
for s3 in symbol:
symbol_order.append([s1,s2,s3])
return symbol_order

def get_order():
the_order=[[]]
for i in range(len(nums)):
l_order=[]
for the in the_order:
for j in range(len(nums)):
if j not in the:
t=the[:]
t.append(j)
l_order.append(t)
the_order=l_order
return the_order
def fd(expresion,number_num,symbol_number,number,symbol):
if symbol_number!=3:
if (number_num - symbol_number)>1:
n_expression = expresion[:]
n_expression.append(symbol[symbol_number])
fd(n_expression, number_num, symbol_number + 1, number,
symbol)
if number_num < 4:
n_expression = expresion[:]
n_expression.append(str(number[number_num]))
fd(n_expression, number_num + 1, symbol_number, number,
symbol)
else:
#print expresion
#print get_result(expresion)
if get_result(expresion)==24:
flag[0]=1

def computer():
symbol=get_symbol()
order=get_order()
num_order=[]
for o in order:
num_order.append([nums[x] for x in o])

for o in num_order:
for s in symbol:
fd([],0,0,o,s)


order = ['0', '0', '+', '0', '+', '0', '+']
flag=[0]
computer()
if flag[0]==0:
return False
else:
return True

猜你喜欢

转载自blog.csdn.net/a1310368974/article/details/78935449