热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python实现二十四点

给定n个数字,计算出一个满足24点的表达式:比如1,11,2,1:(111)*21基本思路就是枚举计算顺序(在一开始进行一次全排列),括号,加减乘除。其实有很多是重复计算过了的。

给定n个数字,计算出一个满足24点的表达式:比如1,11,2,1:(11+1)*2/1


基本思路就是枚举计算顺序(在一开始进行一次全排列),括号,加减乘除。其实有很多是重复计算过了的。这个程序我为了高效找到一个解就算了,但是我们把程序稍微修改就可以找到所有的解(表达顺序可能会重复,比如1+2和2+1),同时也可以计算多个数字的组合。

def compute(x,y,op):if op=='+':return x+yelif op=='*':return x*yelif op=='-':return x-yelse:return x/y if y else Nonedef exp(p,iter=0):from itertools import permutationsif len(p)==1:return [(p[0],str(p[0]))]operation = ['+','-','*','/']ret = []p = permutations(p) if iter==0 else [p]for array_n in p:#print(array_n)for num in range(1,len(array_n)):ret1 = exp(array_n[:num],iter+1)ret2 = exp(array_n[num:],iter+1)for op in operation:for va1,expression in ret1:if va1==None:continuefor va2,expression2 in ret2:if va2==None:continuecombined_exp = '{}{}' if expression.isalnum() else '({}){}'combined_exp += '{}' if expression2.isalnum() else '({})'new_val = compute(va1,va2,op)ret.append((new_val,combined_exp.format(expression,op,expression2)))if iter==0 and new_val==24:return ''.join(e+'\n' for x,e in ret if x==24)return ret
print(exp([2,3,4,11,1,3]))

这里写图片描述


:

EXP = {}
def exp(array_n,target,iter=0):if len(array_n)==1:return [(array_n[0],str(array_n[0]))]operation = ['+','-','*','/']ret = []for num in range(1,len(array_n)):exp1 = array_n[:num]exp2 = array_n[num:]ret1 = EXP[exp1] if exp1 in EXP else exp(exp1,target,iter+1)ret2 = EXP[exp2] if exp2 in EXP else exp(exp2,target,iter+1)EXP[exp1] = ret1EXP[exp2] = ret2for op in operation:for va1,expression in ret1:if va1==None:continuefor va2,expression2 in ret2:if va2==None:continuecombined_exp = '{}{}' if expression.isalnum() else '({}){}'combined_exp += '{}' if expression2.isalnum() else '({})'new_val = compute(va1,va2,op)ret.append((new_val,combined_exp.format(expression,op,expression2)))if iter==0 and new_val==target:#print('ans')return ''.join(e for x,e in ret if x==target)return ret if iter else None
def search(array):record = set()from itertools import permutationsfor p in permutations(array):if p in record:continuerecord.add(p)ret = exp(tuple(p),100)if ret:print(ret);break

推荐阅读
  • 首先需要引用一个COM引用:MicrosoftExcel11.0ObjectLibrary.在程序代码中添加命名空间Microsoft.Office.Interop.Excel的引 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了高效算法求解数独相关的知识,希望对你有一定的参考价值。title:高效算法求解数独 ... [详细]
  • 编程实现QQ表情文件CFC格式
    编程实现QQ表情文件CFC格式背景:最近闲来无事,也应论坛某会员要求,想做个QQ表情下载的站点。本来事情是很简单的,写个小小 ... [详细]
  • pytorch(网络模型训练)
    上一篇目录标题网络模型训练小插曲训练模型数据训练GPU训练第一种方式方式二:查看GPU信息完整模型验证网络模型训练小插曲区别importtorchatorch ... [详细]
  • Asp.net MVC2学习笔记6简单实例(Movie)(下)
    今天我们继续完成这个MVC2简单实例的剩余功能:显示明细、添加、编辑等。。。。。一、显示明细在MoviewsController中的Details方法里右键--Add ... [详细]
  • iText7LtvVerification.addVerifica ... [详细]
  • 下面,我用最简洁的文字尽可能作最详尽的回答:两者之间存在的“五大不同”。与此同时,着重说明MicrosoftWindows64位(x64)操作系统,相对于32位(x86)操作系统的最大优势和劣势是什 ... [详细]
  • 没有得到任何错误,所有数据似乎都有效.出于某种原因,正在调用与视图相关的方法.我确定了以下内容:getItemCount()是唯一被调用的适配器方法,并返回一个正整数值,(我知道 ... [详细]
  • Oracle 数据库 12.2新特性手册Core Improvements内核卷
    Oracle数据库12.2新特性手册-CoreImpro ... [详细]
  • 数据结构-二叉查找树(BST)
    二叉查找树是一种比较特殊的二叉树,表现为任意节点的值都比左孩子的值要大,而且小于等于右孩子的值,采用中序遍历BST(BinarySearchTree ... [详细]
  • [转]Makefile 使用总结
    2019独角兽企业重金招聘Python工程师标准1.Makefile简介Makefile是和make命令一起配合使用的.很多大型项目的编译都是通过Makefile来组织的,如 ... [详细]
  • 前两天有位朋友邀请我回答个问题,为什么MongoDB(索引)使用B-树而Mysql使用B+树?我觉得这个问题非常好,从实际应用的角度来学习数据结构,没有比这更好的方法了。因为 ... [详细]
  • ProblemDescriptionTheCzechTechnicalUniversityisratherold—youalreadyknowthatitcelebrate ... [详细]
  • 个人博客请访问http:www.x0100.topCompletableFuture相比于jdk5所提出的future概念,future在执行的时候支持异步处理& ... [详细]
  • Linux多线程(2)
    线程的知识点太多,太重要,所以分成三部分进行总结学习线程安全多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现该问题。 ... [详细]
author-avatar
九橙seven
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有