题解 | #24点游戏算法# 终于写对了!!!!!!!!!!
24点游戏算法
https://www.nowcoder.com/practice/fbc417f314f745b1978fc751a54ac8cb
# 7*2+1*10=24
'''
# 暴力遍历:过程繁琐,容易遗漏
# 数字的全排序:递归函数
def full_arrangement(num):
if len(num)==1:
return [num]
else:
result=[]
for i in range(len(num)):
rest_num=num[:i]+num[i+1:] # i之前的元素 + i之后的元素
# 剩余字母的全排列
for j in full_arrangement(rest_num):
result.append([num[i]]+j) # i元素与剩余元素各种排列组合在一起
return result
# +-*/ 四个符号中任选一个,选(n-1)次(n个数字有n-1个位置放符号)
def symbol_combain(n):
symbol=['+','-','*','/']
if n==1:
result=[['+'],['-'],['*'],['/']]
else:
result=[]
for i in symbol:
for j in symbol_combain(n-1):
result.append(j+[i])
return result
n=input().split()
# 先去重
n_l=[]
for i in n:
if i not in n_l:
n_l.append(i)
#print(n_l)
arrangements=full_arrangement(n_l)
#print(arrangements)
sym=symbol_combain(len(n_l)-1)
#print(sym,len(sym))
answer=[] # 记录得数
for i in arrangements:
for j in sym:
merge=''
for k in range(len(j)):
merge += i[k]+j[k]
merge += i[-1]
formule=int(eval(merge))
answer.append(formule)
print(merge,formule,answer)
if '+' in j or '-' in j: # 括号情形
if '*' in j or '/' in j:
merge[]
if formule==24:
print('true')
break
else:
print('false')
'''
'''
3 9 3 4
(9-3)*4=24 true
没考虑括号时,输出false(错误)
'''
# bfs 深度优先搜索:一条路径走到底后需要返回上一步(父节点),搜索第二条路径
# 可用递归函数
'''
def calculate(arr,n): # 返回true/false
if len(arr)==1:
return arr[0]==n
else:
for i in range(len(arr)):
n1=arr[i]
rest_n=arr[:i]+arr[i+1:]
if calculate(rest_n,n+n1) or calculate(rest_n,n-n1) or calculate(rest_n,n*n1) or calculate(rest_n,n/n1):
return True
else:
return False
#if条件依次代表:f(rest_n)-n1=n 减法
#f(rest_n)+n1=n 加法
#f(rest_n)/n1=n 除法
#f(rest_n)*n1=n 乘法
while 1:
try:
n=list(map(int,input().split())) # 数字可以重复,不用去重
if calculate(n,24):
print('true')
else:
print('false')
except:
break
'''
import itertools
def fun(arr, y):
# 前面的结果与后一个数加减乘除的可能
res = []
for x in arr:
res.append(x) # x y 自身必须放进结果列表,
res.append(y)
res.append(x + y)
res.append(x - y)
res.append(x * y)
if y==0:
continue
res.append(x / y) # 如果y==0,会导致程序异常退出,此时跳过除法,继续循环
return res
while 1:
try:
num_list = [int(i) for i in input().split()]
#print(num_list)
# 所有数字排列的顺序都考虑进去
for i in range(len(list(itertools.permutations(num_list)))):
a, b, c, d = list(itertools.permutations(num_list))[i]
#print(a,b,c,d)
list1 = fun([a], b)
list2 = fun(list1, c)
list3 = fun(list2, d)
list4 = fun([a],b) # 前两个数运算
list5 = fun([c],d) # 后两个数运算
list7=[]
for j in list5:
list6=fun(list4,j) # 前两数结果挨个与后两个结果运算
list7.extend(list6)
#print(list7)
if 24 in list3 or 24 in list7:
print('true')
break
else:
print('false')
except:
break


查看1道真题和解析