计算器24点游戏戏8352怎么算

豆丁微信公众号
君,已阅读到文档的结尾了呢~~
24点游戏练习题
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
24点游戏练习题
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口www.hga0088.am/ 转iulhhn
视频地址复制
Flash地址复制
Html地址复制
离线看更方便
用或其他应用扫描二维码
王者荣耀 周瑜放火 百里放枪 看谁更胜一筹!_标清_1
广播电视节目制作经营许可证:(沪)字第1248号
| 网络文化经营许可证:沪网文[6号 | 信息网络传播视听节目许可证:0910417 | 互联网ICP备案:沪ICP备号-3 沪ICP证:沪B2- | 违法不良信息举报邮箱: | 违法不良信息举报电话:转3
公司名称:上海宽娱数码科技有限公司 | 公司地址:上海市杨浦区政立路485号 | 客服电话:【每周一练】LabVIEW益智游戏-24点:程序设计详解 - LabVIEW论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
【每周一练】LabVIEW益智游戏-24点:程序设计详解
助理工程师
21:48:37  
【每周一练】LabVIEW益智游戏 - 2048【已结束】
【每周一练】LabVIEW益智游戏 - 24点【已结束】
【每周一练】LabVIEW益智游戏 - 撑竹竿过河【已结束】
电子发烧友论坛每周一练第二期益智游戏24点活动已经结束了,源程序和评分都已在原网页上发布,喜欢的下载下来看看,一定能从中学到很多东西。
我侥幸的得到了第一名,现在跟大家分享一下程序设计经验,其中定会存在不足,还望高手多多指点。
我的程度的整体设计思路已在《开发者文档》中写的比较清楚了,但文档是在最初开发程序时写的,现在看来,也有不正确的地方,接下来跟大家分享该文档,结合文档中的问题与大家在程序设计中存在的问题,再次详细的分析该程序的设计要点。
以下摘自《开发者文档》并适当修改:
1、采用生产者消费者结构
程序可以仅使用事件结构,但生产者消费者结构维护方便,更便于程序的实现。
2、程序比较简单,为了程序结构的简洁,不使用自定义控件
队列元素使用字符串;
扑克的显示使用图片下拉列表组成的数组。
3、程序功能
包括24点游戏、批量24点计算、概率计算(包括理论与随机概率计算)全部的要求。
4、随机生成4个数
给的建议为随机生成4个1-13的数,样本为13^4,不符合实际的52取4的样本。
考虑实际的游戏情况,应该是52随机取4,程序实现中可以先将52张牌随机洗牌,之后抽取最前边4张组成四张牌,下一轮抽取剩下48张牌的最前边4张,依次往后…剩余牌数为0时,自动随机洗牌,同时可增加手动洗牌的功能。
洗牌可采用LabVIEW自带的【重排数组元素】。
可以每次都重新洗牌,对统计概率没有影响,但每次都洗牌不符合实际,同时影响程序性能。
程序中用到了将字符串当公式计算结果,采用LabVIEW自带的【公示节点求值】(该VI功能强大,也比较难懂,本题目的要求比较简单,还可以自己编写简单易懂的程序,也可以使用动态链接库来完成)。
同时计算器需要验证输入的字符串是否符合要求,比如直接输入24,计算结果就是24,需增加验证程序;
计算结果的与(24-精度)跟(24+精度)比较即可判断是否正确(精度建议取1e-6~1/13),直接判断或转为整数(四舍五入等)后判断是否等于24不正确。
6、自动计算公式
即常见的枚举法填运算符,考虑程序运行效率,使用调用动态链接库的方法,由C语音完成算法的实现。
点击“我不会”之后,结果公式自动填入公式输入框,而不是提示栏,便于游戏。
7、自动计算算法
整体运算格式分两种情况:
第1种表达式:(data1□data2)□(data3□data4)=24;
该表达式只用4个数循环代入、穷举4*4*4种运算符即可。
第2种表达式:((data1□data2)□data3)□data4=24;
使用4个数循环代入,该表达式可包括以下表达式:
data1□(data2□(data3□data4))=24;data1□((data2□data3)□data4)=24;(data1□(data2□data3))□data4=24;
但由于减法、除法的两个操作数是不可交换的,增加反减(交换操作数后做减法)、反除(交换操作数后做除法)两个运算,
该种表达式需穷举4*6*6种运算符。
鉴于本程序需求只用提示一个解,以上程序只要找到一个解即可退出返回。
具体算法见源代码,如完全用LabVIEW实现,也可按该代码实现,但LabVIEW的程序效率会较低。
8、批量24点计算
未说明批量的量有多大,但给的样本仅1.27kb,按文件最大20M计算,可一次性读取文件、操作显示,未进行分批次及内存管理;
输出结果用二维数组字符串表示,数组拼接效率地下,尽量采用批量操作;
用时都在1ms内(显示的1ms其实是正好赶上毫秒数更换,并没有1ms),无意思。
9、理论概率计算
应该按52取4的方法计算,样本270725,有解217817,有解率80.4569%,用时18~22秒。
顺便计算13选1选4次的概率,样本为13^4=28561,有解22615,有解率79.1814%,用时1.8~2.3秒。
1820种不同的组合,有解1362,有解率74.8352%,用时0.2~0.4秒,使用该方法可以判断算法是否正确;
以上测试计时用CPU为i5-3470。
10、随机概率计算
自动进行发牌操作,统计有解概率,仅统计与实际游戏相符的52取4的有解概率,理论值为80.4569%。
增加保留历史发牌总数与有解数量的功能,清除数据时数弹窗提示。
测试的几千万的历史数据得到的概率为80.44%~80.46%,与理论值80.4569%接近。
11、界面设计、程序注释、图标优化
时间有限(24日才在论坛看到),界面只做简单的设计,在一个界面中显示了所有功能,没有弹窗等,界面一般;
程序使用生产者消费者结构,比较容易理解,简单制作图标。
12、键盘操作优化
增加各按钮的键盘操作快捷键,Esc、F1~F12,方便操作。
13、软件使用说明
完善开发者文档、编写软件Readme文档。
14、扩展:增加任意输入4个数返回公式结果功能。
15、扩展(未做)
1-10的24点扩展
只需修改洗牌(40的全排)与显示处(换下拉列表框,或按13的列表框修改值)的程序即可,概率统计也只用修改52、13等值即可。
三种概率依次为:=87.4669%、=85.8500%、566/715=79.1608%。
程序设计补完·201511
助理工程师
21:52:48  
结合大家的程序中的问题:
如下面的两张图,未对输入的公式做检测,会出现bug,增加检测输入的数据是否合法。
如:将字符串转为U8数组,通过ascii码判断,字符串中必须出现abcd且只能出现一次(且a
bcd不能挨着,或将挨着时自动当作乘法计算),除此之外,字符串中不能出现+、-、*、/、(、)以外的字符。
有了这些检测,bug应该就没有了。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
22:02:44  
同样是未对输入的字符串进行检测,同时我们还发现了另一个bug:8/(3-8/3)!=24!
在大家的作品中,都忽视了一个计算机计算的常识性问题:浮点数计算的精度损失!
对计算机而言8/(3-8/3)是不等于24的,我们要把损失的精度考虑进去,比较 abs(8/(3-8/3))-24)&精度,这样才能得到正确的结果。
一般的编程人员喜欢把这个精度设置为1E-6,在本次计算中这个精度必须小于1/13,同时不建议小于1e-6。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
22:11:12  
批量计算、概率计算时,程序会卡比较久的时间的话,应设置前面版为忙碌,防止误操作。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
22:17:36  
niezidong的程序的计时设计存在问题。
yuanchgen的程序存在两个致命的飞一样循环。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
22:27:31  
本帖最后由 bamenwhj 于
22:28 编辑
接着再说一下我的程序问题,前面提到的那些基本都已考虑到,但还是存在问题:
1、使用F2快捷键计算会产生bug;
2、还有就是批量计算如果需要支持大量数据的话也应该优化一下。
结合《开发者文档》就会发现,增加快捷键以及批量处理的分析存在错误。对于大数据当时考虑的太乐观,未实际检测,其实3M的数据就已经有30W条记录了,实现起来就比较困难了,文档中说的20M信口开河了。如果要支持特大数据量建议分批读取文档、写入另一文档处理,如前面版显示必须做个最大条数限制,建议几万条就是极限了。
除此之外,程序框图中也存在许多可以优化的地方,这里就不再列举了。
如果前面板还有其他bug的化,欢迎大家反馈,谢谢!
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
23:00:10  
接着说一下程序的优化及其他作品很好的地方。
1、“手动输入公式有点麻烦,如果能有niezidong的按键输入就好了”
个人觉得:(1)按键输入的计算器,实现最简单,实用性最差;(2)带数值的字符串计算器,实现难度上升,实用性增强;(3)带变量的字符串计算器,实现难度最高,实用性最强。此题目考虑实际的应用性按第三种实现方式最好,题目给的是第三种方式,采用其他方式会降低难度。
题目没有具体要求使用那种方式,应该只要完美的实现功能即可,但本次使用按键输入的作品中,均因对输入的检测不够未很好的实现此功能。
其中niezidong的作品既使用了按键输入,又采用的是带变量的字符串计算器,这点做的很好,同时还注意到了退格键,跟其他使用按键输入的作品强了很多,值得大家学习!
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
23:07:29  
2、程序可进一步考虑优先级,删掉公式中多余括号
本次作品中,包括我在内的大部分作品均未删除括号,从我使用的算法的角度有括号更能体现算法,不建议在算法中删除括号(如果大家使用其他合适的方法可直接删除),
可以在算出答案字符串之后再对字符串进行去括号处理。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
23:14:13  
3、niezidong的作品的做了个完成题目的题库,思想很不错。
其实24点这个题目除了高效的计算之外,使用数据库也是个不错的选择。
附件xls中是我做的包含1820个不同组个的一个解及枚举完成后解的个数,按照这个做个数据库的话效率也是很高的。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
23:19:40  
4、任意输入4个数值求解
这是一个很简单的功能,但是很实用的,开放这个功能还是比较好的,可以算个更完善的24点。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
23:42:27  
5、算法详解、所有解
本次设计中仅要求提示一个答案,考虑到效率,程序找到一个解即返回,其实求所有解反而是一项更简单的工作。
这个一个典型穷举问题,当把所有的情况穷举完,就能知道是否有解并知道不同解数量。
注1:认为a、b、c、d即使值相同也是不同的数;
注2:认为加括号导致优先级不同的算式为不同的解,即a+b+c+d与a+(b+c)+d为不同的解。
穷举算法:
将4个数循环代入:4*3*2*1种循环;
确定运算符顺序(加括号):3*2*1共6顺序:
①②③:((data1□data2)□data3)□data4=24;
①③②:(data1□data2)□(data3□data4)=24;
②①③:(data1□(data2□data3))□data4=24;
②③①:data1□((data2□data3)□data4)=24;
③①②:(data1□data2)□(data3□data4)=24;
③②①:data1□(data2□(data3□data4))=24;
其中①③②与③①②均为(data1□data2)□(data3□data4)=24,其实质为1种顺序,
为此总共有5种情况;
最后将4种运算符依次枚举:4*4*4;这个枚举算法就完成了。
总共有4!*4^3*5种可能,即4*3*2*1*4^3*5=7680种情况,这个复杂度对计算机而言是轻而易举实现的。
如仅需找到一个解或判断是否有解,可以对以上穷举进行简单优化,优化的算法就是我使用的算法。
第1种表达式:(data1□data2)□(data3□data4)=24;
该表达式只用4个数循环代入、穷举4*4*4种运算符即可。
第2种表达式:((data1□data2)□data3)□data4=24;
使用4个数循环代入,该表达式可包括以下表达式:
data1□(data2□(data3□data4))=24;data1□((data2□data3)□data4)=24;(data1□(data2□data3))□data4=24;
但由于减法、除法的两个操作数是不可交换的,增加反减(交换操作数后做减法)、反除(交换操作数后做除法)两个运算,
该种表达式需穷举4*6*6种运算符。
这样总共有4!*(4^3+4*6*6)种可能,即4*3*2*(4*4*4+4*6*6)=4992种情况,优化了35%!
助理工程师
00:01:36  
6、关于概率计算,《开发者文档》中已经写的很详细的,大家可参阅该方法完成概率计算。
首先需要确保1820种不同组合得到的解与我的结果相同(有解无解均相同),得不到1362个有解的请参阅之前提到的浮点数计算精度、枚举方法及我提供的结果表格仔细思考……
得到1362个正解之后只需要跑两个循环理论概率就出来了~~
统计概率建立在大数据的基础上,也可以像我一样考虑加上保存功能,方便建立大数据。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
00:08:46  
到此,关于24点的程序设计详解已结束,如有不足欢迎大家指出,如还有不清楚的也请大家积极提问~~
11月份的【每周一练】题目为2048:
又是一个关于算法的问题,版主提供了博弈树中典型的极大值极小值+αβ剪枝的方法,如果大家能用这个方法实现的最好。
不过,我建议设计一个好的评估函数,直接使用贪心策略即可。
还请大家积极参与,有好的想法互相交流。
09:47:59  
先回复顶一下,再下载看看。。。
09:48:46  
先回复顶一下,再下载看看。。。
09:48:56  
先回复顶一下,再下载看看。。。
20:12:19  
顶,学习了,大神的代码确实效率高!
21:38:46  
22:11:25  
顶起来。。。。。
15:11:57  
太厉害了!够我学好久的
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
下载作业帮安装包
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
用3,4,—6,10四个有理数算出24点(必须全部用上,要三个算式,多多益善)
作业帮用户
扫二维码下载作业帮
拍照搜题,秒出答案,一键查看所有搜题记录
(10+4-6)*3=24
为您推荐:
其他类似问题
扫描下载二维码【每周一练】LabVIEW益智游戏-24点:程序设计详解 - LabVIEW论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
【每周一练】LabVIEW益智游戏-24点:程序设计详解
助理工程师
21:48:37  
【每周一练】LabVIEW益智游戏 - 2048【已结束】
【每周一练】LabVIEW益智游戏 - 24点【已结束】
【每周一练】LabVIEW益智游戏 - 撑竹竿过河【已结束】
电子发烧友论坛每周一练第二期益智游戏24点活动已经结束了,源程序和评分都已在原网页上发布,喜欢的下载下来看看,一定能从中学到很多东西。
我侥幸的得到了第一名,现在跟大家分享一下程序设计经验,其中定会存在不足,还望高手多多指点。
我的程度的整体设计思路已在《开发者文档》中写的比较清楚了,但文档是在最初开发程序时写的,现在看来,也有不正确的地方,接下来跟大家分享该文档,结合文档中的问题与大家在程序设计中存在的问题,再次详细的分析该程序的设计要点。
以下摘自《开发者文档》并适当修改:
1、采用生产者消费者结构
程序可以仅使用事件结构,但生产者消费者结构维护方便,更便于程序的实现。
2、程序比较简单,为了程序结构的简洁,不使用自定义控件
队列元素使用字符串;
扑克的显示使用图片下拉列表组成的数组。
3、程序功能
包括24点游戏、批量24点计算、概率计算(包括理论与随机概率计算)全部的要求。
4、随机生成4个数
给的建议为随机生成4个1-13的数,样本为13^4,不符合实际的52取4的样本。
考虑实际的游戏情况,应该是52随机取4,程序实现中可以先将52张牌随机洗牌,之后抽取最前边4张组成四张牌,下一轮抽取剩下48张牌的最前边4张,依次往后…剩余牌数为0时,自动随机洗牌,同时可增加手动洗牌的功能。
洗牌可采用LabVIEW自带的【重排数组元素】。
可以每次都重新洗牌,对统计概率没有影响,但每次都洗牌不符合实际,同时影响程序性能。
程序中用到了将字符串当公式计算结果,采用LabVIEW自带的【公示节点求值】(该VI功能强大,也比较难懂,本题目的要求比较简单,还可以自己编写简单易懂的程序,也可以使用动态链接库来完成)。
同时计算器需要验证输入的字符串是否符合要求,比如直接输入24,计算结果就是24,需增加验证程序;
计算结果的与(24-精度)跟(24+精度)比较即可判断是否正确(精度建议取1e-6~1/13),直接判断或转为整数(四舍五入等)后判断是否等于24不正确。
6、自动计算公式
即常见的枚举法填运算符,考虑程序运行效率,使用调用动态链接库的方法,由C语音完成算法的实现。
点击“我不会”之后,结果公式自动填入公式输入框,而不是提示栏,便于游戏。
7、自动计算算法
整体运算格式分两种情况:
第1种表达式:(data1□data2)□(data3□data4)=24;
该表达式只用4个数循环代入、穷举4*4*4种运算符即可。
第2种表达式:((data1□data2)□data3)□data4=24;
使用4个数循环代入,该表达式可包括以下表达式:
data1□(data2□(data3□data4))=24;data1□((data2□data3)□data4)=24;(data1□(data2□data3))□data4=24;
但由于减法、除法的两个操作数是不可交换的,增加反减(交换操作数后做减法)、反除(交换操作数后做除法)两个运算,
该种表达式需穷举4*6*6种运算符。
鉴于本程序需求只用提示一个解,以上程序只要找到一个解即可退出返回。
具体算法见源代码,如完全用LabVIEW实现,也可按该代码实现,但LabVIEW的程序效率会较低。
8、批量24点计算
未说明批量的量有多大,但给的样本仅1.27kb,按文件最大20M计算,可一次性读取文件、操作显示,未进行分批次及内存管理;
输出结果用二维数组字符串表示,数组拼接效率地下,尽量采用批量操作;
用时都在1ms内(显示的1ms其实是正好赶上毫秒数更换,并没有1ms),无意思。
9、理论概率计算
应该按52取4的方法计算,样本270725,有解217817,有解率80.4569%,用时18~22秒。
顺便计算13选1选4次的概率,样本为13^4=28561,有解22615,有解率79.1814%,用时1.8~2.3秒。
1820种不同的组合,有解1362,有解率74.8352%,用时0.2~0.4秒,使用该方法可以判断算法是否正确;
以上测试计时用CPU为i5-3470。
10、随机概率计算
自动进行发牌操作,统计有解概率,仅统计与实际游戏相符的52取4的有解概率,理论值为80.4569%。
增加保留历史发牌总数与有解数量的功能,清除数据时数弹窗提示。
测试的几千万的历史数据得到的概率为80.44%~80.46%,与理论值80.4569%接近。
11、界面设计、程序注释、图标优化
时间有限(24日才在论坛看到),界面只做简单的设计,在一个界面中显示了所有功能,没有弹窗等,界面一般;
程序使用生产者消费者结构,比较容易理解,简单制作图标。
12、键盘操作优化
增加各按钮的键盘操作快捷键,Esc、F1~F12,方便操作。
13、软件使用说明
完善开发者文档、编写软件Readme文档。
14、扩展:增加任意输入4个数返回公式结果功能。
15、扩展(未做)
1-10的24点扩展
只需修改洗牌(40的全排)与显示处(换下拉列表框,或按13的列表框修改值)的程序即可,概率统计也只用修改52、13等值即可。
三种概率依次为:=87.4669%、=85.8500%、566/715=79.1608%。
程序设计补完·201511
助理工程师
21:52:48  
结合大家的程序中的问题:
如下面的两张图,未对输入的公式做检测,会出现bug,增加检测输入的数据是否合法。
如:将字符串转为U8数组,通过ascii码判断,字符串中必须出现abcd且只能出现一次(且a
bcd不能挨着,或将挨着时自动当作乘法计算),除此之外,字符串中不能出现+、-、*、/、(、)以外的字符。
有了这些检测,bug应该就没有了。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
22:02:44  
同样是未对输入的字符串进行检测,同时我们还发现了另一个bug:8/(3-8/3)!=24!
在大家的作品中,都忽视了一个计算机计算的常识性问题:浮点数计算的精度损失!
对计算机而言8/(3-8/3)是不等于24的,我们要把损失的精度考虑进去,比较 abs(8/(3-8/3))-24)&精度,这样才能得到正确的结果。
一般的编程人员喜欢把这个精度设置为1E-6,在本次计算中这个精度必须小于1/13,同时不建议小于1e-6。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
22:11:12  
批量计算、概率计算时,程序会卡比较久的时间的话,应设置前面版为忙碌,防止误操作。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
22:17:36  
niezidong的程序的计时设计存在问题。
yuanchgen的程序存在两个致命的飞一样循环。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
22:27:31  
本帖最后由 bamenwhj 于
22:28 编辑
接着再说一下我的程序问题,前面提到的那些基本都已考虑到,但还是存在问题:
1、使用F2快捷键计算会产生bug;
2、还有就是批量计算如果需要支持大量数据的话也应该优化一下。
结合《开发者文档》就会发现,增加快捷键以及批量处理的分析存在错误。对于大数据当时考虑的太乐观,未实际检测,其实3M的数据就已经有30W条记录了,实现起来就比较困难了,文档中说的20M信口开河了。如果要支持特大数据量建议分批读取文档、写入另一文档处理,如前面版显示必须做个最大条数限制,建议几万条就是极限了。
除此之外,程序框图中也存在许多可以优化的地方,这里就不再列举了。
如果前面板还有其他bug的化,欢迎大家反馈,谢谢!
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
23:00:10  
接着说一下程序的优化及其他作品很好的地方。
1、“手动输入公式有点麻烦,如果能有niezidong的按键输入就好了”
个人觉得:(1)按键输入的计算器,实现最简单,实用性最差;(2)带数值的字符串计算器,实现难度上升,实用性增强;(3)带变量的字符串计算器,实现难度最高,实用性最强。此题目考虑实际的应用性按第三种实现方式最好,题目给的是第三种方式,采用其他方式会降低难度。
题目没有具体要求使用那种方式,应该只要完美的实现功能即可,但本次使用按键输入的作品中,均因对输入的检测不够未很好的实现此功能。
其中niezidong的作品既使用了按键输入,又采用的是带变量的字符串计算器,这点做的很好,同时还注意到了退格键,跟其他使用按键输入的作品强了很多,值得大家学习!
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
23:07:29  
2、程序可进一步考虑优先级,删掉公式中多余括号
本次作品中,包括我在内的大部分作品均未删除括号,从我使用的算法的角度有括号更能体现算法,不建议在算法中删除括号(如果大家使用其他合适的方法可直接删除),
可以在算出答案字符串之后再对字符串进行去括号处理。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
23:14:13  
3、niezidong的作品的做了个完成题目的题库,思想很不错。
其实24点这个题目除了高效的计算之外,使用数据库也是个不错的选择。
附件xls中是我做的包含1820个不同组个的一个解及枚举完成后解的个数,按照这个做个数据库的话效率也是很高的。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
23:19:40  
4、任意输入4个数值求解
这是一个很简单的功能,但是很实用的,开放这个功能还是比较好的,可以算个更完善的24点。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
23:42:27  
5、算法详解、所有解
本次设计中仅要求提示一个答案,考虑到效率,程序找到一个解即返回,其实求所有解反而是一项更简单的工作。
这个一个典型穷举问题,当把所有的情况穷举完,就能知道是否有解并知道不同解数量。
注1:认为a、b、c、d即使值相同也是不同的数;
注2:认为加括号导致优先级不同的算式为不同的解,即a+b+c+d与a+(b+c)+d为不同的解。
穷举算法:
将4个数循环代入:4*3*2*1种循环;
确定运算符顺序(加括号):3*2*1共6顺序:
①②③:((data1□data2)□data3)□data4=24;
①③②:(data1□data2)□(data3□data4)=24;
②①③:(data1□(data2□data3))□data4=24;
②③①:data1□((data2□data3)□data4)=24;
③①②:(data1□data2)□(data3□data4)=24;
③②①:data1□(data2□(data3□data4))=24;
其中①③②与③①②均为(data1□data2)□(data3□data4)=24,其实质为1种顺序,
为此总共有5种情况;
最后将4种运算符依次枚举:4*4*4;这个枚举算法就完成了。
总共有4!*4^3*5种可能,即4*3*2*1*4^3*5=7680种情况,这个复杂度对计算机而言是轻而易举实现的。
如仅需找到一个解或判断是否有解,可以对以上穷举进行简单优化,优化的算法就是我使用的算法。
第1种表达式:(data1□data2)□(data3□data4)=24;
该表达式只用4个数循环代入、穷举4*4*4种运算符即可。
第2种表达式:((data1□data2)□data3)□data4=24;
使用4个数循环代入,该表达式可包括以下表达式:
data1□(data2□(data3□data4))=24;data1□((data2□data3)□data4)=24;(data1□(data2□data3))□data4=24;
但由于减法、除法的两个操作数是不可交换的,增加反减(交换操作数后做减法)、反除(交换操作数后做除法)两个运算,
该种表达式需穷举4*6*6种运算符。
这样总共有4!*(4^3+4*6*6)种可能,即4*3*2*(4*4*4+4*6*6)=4992种情况,优化了35%!
助理工程师
00:01:36  
6、关于概率计算,《开发者文档》中已经写的很详细的,大家可参阅该方法完成概率计算。
首先需要确保1820种不同组合得到的解与我的结果相同(有解无解均相同),得不到1362个有解的请参阅之前提到的浮点数计算精度、枚举方法及我提供的结果表格仔细思考……
得到1362个正解之后只需要跑两个循环理论概率就出来了~~
统计概率建立在大数据的基础上,也可以像我一样考虑加上保存功能,方便建立大数据。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
助理工程师
00:08:46  
到此,关于24点的程序设计详解已结束,如有不足欢迎大家指出,如还有不清楚的也请大家积极提问~~
11月份的【每周一练】题目为2048:
又是一个关于算法的问题,版主提供了博弈树中典型的极大值极小值+αβ剪枝的方法,如果大家能用这个方法实现的最好。
不过,我建议设计一个好的评估函数,直接使用贪心策略即可。
还请大家积极参与,有好的想法互相交流。
09:47:59  
先回复顶一下,再下载看看。。。
09:48:46  
先回复顶一下,再下载看看。。。
09:48:56  
先回复顶一下,再下载看看。。。
20:12:19  
顶,学习了,大神的代码确实效率高!
21:38:46  
22:11:25  
顶起来。。。。。
15:11:57  
太厉害了!够我学好久的
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司

我要回帖

更多关于 算24点游戏 的文章

 

随机推荐