`
595959
  • 浏览: 63663 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

解24点

 
阅读更多
http://rosettacode.org/wiki/24_game_Player

上面链接里的暴力解法相似的输出项太多了,我总结了相互间不重复的表达式88种(4个数字加减乘除):
MAN4D4S = [
        # '((%d %s %d) %s %d) %s %d' 48
        # +++
        '%d + %d + %d + %d',
        # ++-
        '%d + %d + %d - %d',
        # ++*
        '(%d + %d + %d) * %d',
        '(%d + %d) * %d + %d',
        '%d * %d + %d + %d',
        # ++/
        '(%d + %d + %d) / %d',
        '(%d + %d) / %d + %d',
        '(%d / %d) + %d + %d',
        # +--
        '%d + %d - %d - %d',
        # +-*
        '(%d + %d - %d) * %d',
        '(%d + %d) * %d - %d',
        '(%d - %d) * %d + %d',
        '%d * %d + %d - %d',
        # +-/
        '(%d + %d - %d) / %d',
        '(%d + %d) / %d - %d',
        '(%d - %d) / %d + %d',
        '%d / %d + %d - %d',
        # +**
        '(%d + %d) * %d * %d',
        '(%d * %d + %d) * %d',
        '%d * %d * %d + %d',
        # +*/
        '(%d + %d) * %d / %d',
        '(%d * %d + %d) / %d',
        '%d * %d / %d + %d',
        '(%d / %d + %d) * %d',
        # +//
        '(%d + %d) / %d / %d',
        '(%d / %d + %d) / %d',
        '%d / %d / %d + %d',
        # ---
        '%d - %d - %d - %d',
        # --*
        '(%d - %d - %d) * %d',
        '(%d - %d) * %d - %d',
        '%d * %d - %d - %d',
        # --/
        '(%d - %d - %d) / %d',
        '(%d - %d) / %d - %d',
        '%d / %d - %d - %d',
        # -**
        '(%d - %d) * %d * %d',
        '(%d * %d - %d) * %d',
        '%d * %d * %d - %d',
        # -*/
        '(%d - %d) * %d / %d',
        '(%d * %d - %d) / %d',
        '%d * %d / %d - %d',
        '(%d / %d - %d) * %d',
        # -//
        '(%d - %d) / %d / %d',
        '(%d / %d - %d) / %d',
        '%d / %d / %d - %d',
        # ***
        '%d * %d * %d * %d',
        # **/
        '%d * %d * %d / %d',
        # *//
        '%d * %d / %d / %d',
        # ///
        '%d / %d / %d / %d',
        
        # '(%d %s (%d %s %d)) %s %d' +8
        '(%d - %d * %d) * %d',
        '(%d - %d / %d) * %d',
        '%d / (%d + %d) * %d',
        '%d / (%d - %d) * %d',
        '(%d - %d * %d) / %d',
        '(%d - %d / %d) / %d',
        '%d / (%d + %d) / %d',
        '%d / (%d - %d) / %d',

        # '(%d %s %d) %s (%d %s %d)' +14
        '%d * %d + %d * %d',
        '%d * %d + %d / %d',
        '%d / %d + %d / %d',
        '%d * %d - %d * %d',
        '%d * %d - %d / %d',
        '%d / %d - %d * %d',
        '%d / %d - %d / %d',
        '(%d + %d) * (%d + %d)',
        '(%d + %d) * (%d - %d)',
        '(%d - %d) * (%d - %d)',
        '(%d + %d) / (%d + %d)',
        '(%d + %d) / (%d - %d)',
        '(%d - %d) / (%d + %d)',
        '(%d - %d) / (%d - %d)',
        
        # '%d %s ((%d %s %d) %s %d)' +14
        '%d - ((%d + %d) * %d)',
        '%d - ((%d + %d) / %d)',
        '%d - ((%d - %d) * %d)',
        '%d - ((%d - %d) / %d)',
        '%d - (%d * %d * %d)',
        '%d - (%d * %d / %d)',
        '%d - (%d / %d / %d)',
        '%d / (%d + %d + %d)',
        '%d / (%d + %d - %d)',
        '%d / (%d - %d - %d)',
        '%d / (%d * %d + %d)',
        '%d / (%d * %d - %d)',
        '%d / (%d / %d + %d)',
        '%d / (%d / %d - %d)',
        
        # '%d %s (%d %s (%d %s %d))' +4
        '%d - (%d / (%d + %d))',
        '%d - (%d / (%d - %d))',
        '%d / (%d - %d * %d)',
        '%d / (%d - %d / %d)'
      ]


用上面的字典就不需要分步求解了,我做成了Gem

gem install 24games


下面是分步思路

“舍弃相似项、变换表达式”

定义操作符优先级:

@@ops_pri = {"**" => 0,"*" => 1,"/"  => 1,"+" => 2,"-" => 2 }

依照操作符的优先级判断是否加括号。

5种执行流:

"i_i_i_i" => a op b op c op d     |e.g. (a+b)*c+d : (2+5)*3+3
"i_i_(i_i)" => a op b op (c op d) |e.g. (a-b)/(c/d) : (13-7)/(2/8)
"i_(i_i)_i" => a op (b op c) op d |e.g. (a-b/c)*d : (13-10/2)*3
"i_(i_i_i)" => a op (b op c op d) |e.g. a/(b/c/d): 6/(2/2/4)
"i_(i_(i_i))" => a op (b op (c op d))  |e.g. a/(b-c/d) : 8/(3-8/3)

为什么是5种,有另外一种思路:4张扑克,依次夹入3个操作符

第1个操作符,可以把4张扑克分割成“3张1张”、“2张2张”、“1张3张”三种形式;

“2张2张”的场合,后两个操作符分别夹到每个“2张”中间;

“3张”的场合,可以被第二个操作符继续分割成“2张1张”或者“1张2张”,最后在“2张”中间夹入第三个操作符;

总结起来五种流程。

iiii => i iii => i i ii => i i i i

iiii => i iii => i ii i => i i i i

iiii => ii ii =>  i i i i

iiii => iii i => i ii i => i i i i

iiii => iii i => ii i i => i i i i

把三步走并成表达式,并加上括号,一个项就出炉了。

给表达式加括号是一个小课题。它基于三个条件:上一次操作符、本次操作符、本次操作之于上次操作的位置。如果本次操作符的优先级高于上一次,或者同级条件下,准备减去或者除以上一次表达式,需给上一次表达式加上括号。

如果三步走的结果等于24,我们就该将它存入结果集了。我用了一个Hash作为结果集,KEY由操作符组和执行流组成,VALUE放这次计算的卡片组。Hash能够把1234相乘的24种排列组合并成一种解法。

“合并相似项”


操作符流合并
    合并工作的大头。 遵循("+" > "-" > "*" > "/" > "**")。分别在确定操作符组和执行流两个阶段进行过滤,要时刻清醒条件语句依靠基准的先后顺序。

e.g. a*(b*c)/d,a*(b/c*d),a/b*c*d,a*b/(c/d)...... 都取"**/"操作符组+"i_i_i_i"执行流;


运算合并
    0点的运算合并。如果0点的牌面用来被做+、-运算,都等同于“不参与计算”。取+0。
    1点的运算合并。如果1点的牌面用来被做*、/、**运算,都等同于“不参与计算”。取*1。
    2点的运算合并。2点的牌面被2点“*”或者“**”,取*2;4点的牌面被2点“-”或者“/”,取-2。


避免除法磨损
    e.g. 3388,利用分式能得出8/(3-8/3)=24,但是,电脑算除法若产生的结果大于1且小数除不尽,会产生偏差。考虑到这一点,需要把 8/(3-8/3) 通分成 8*3/(3*3-8) 处理(计算时按"4个操作符"+"i_i_(i_i_i)"执行流)。

分享到:
评论

相关推荐

    c语言递归解24点游戏

    《C语言实现递归解24点游戏》 24点游戏是一款广受欢迎的智力游戏,玩家需要通过加、减、乘、除四种运算符,将四张牌上的数字组合成24。在这个过程中,C语言可以作为一种有效的工具,利用递归算法来解决这个问题。 ...

    c语言解24点问题课程设计.doc

    "c语言解24点问题课程设计" 本课程设计旨在使用C语言来解决24点问题,旨在帮助学生学习C语言基础知识和技能,并掌握如何编辑、编译、连接和运行一个C程序。通过本课程设计,学生将掌握穷举法的概念和应用,了解...

    24点游戏以及通用的24点计算器源码

    这是一个二十四点小程序,功能分成二十四点游戏和二十四点计算器两个部分。目标及其实现如下。 1. 目标:控制台输入4个数字,产生一组解 实现:【24点计算机---一个结果】 2. 目标:测试所有二十四点问题,给出...

    24点游戏无重解算法的研究与探讨

    ### 24点游戏无重解算法的研究与探讨 #### 摘要 本文主要针对24点游戏中的“无重解”算法进行深入的研究与探讨。24点游戏是一种非常受欢迎的数字游戏,它的基本玩法是:从一副扑克牌(去掉大小王)中随机抽取四张...

    自己编写的求24点所有解的VB源代码及程序

    输入4个数,自动计算出24点的所有的可能解。网络上求一个解的代码多,求所有可能解的代码少,VB的就更少了。24点无非下列几种种解法: 1.(a符号b)符号(c符号d)形式 例如:(9-5)*(10-6) 2.((a符号b)符号...

    C语言程序 解决24点

    解决24点问题的C语言程序,有兴趣的朋友可以看看,谢谢!

    Java 二十四点程序 24点程序 加减乘除24

    Java 二十四点程序是一款基于图形用户界面(GUI)的应用程序,设计用于解决经典的数学游戏——24点。这个游戏的目标是通过加、减、乘、除四种基本运算,使得四个给定的1到13之间的数字组合的结果恰好等于24。程序的...

    24点数学意义上的基解C++程序

    24点在数学意义上的基解,基于组合方式的改进,剔除了数学意义上的重复解

    二十四点小游戏,用c++实现的

    二十四点游戏是一款广受欢迎的智力挑战游戏,目标是将四张牌(每个1到13之间)通过加、减、乘、除运算得出24的结果。本项目使用C++编程语言实现了这个小游戏,下面我们将深入探讨其背后的算法和程序设计思路。 1. *...

    10以内24点解法大全

    制作了一个关于24点游戏的解法的一个文档,里面对于10以内的24点的所有可解游戏都给出了至少一种解法。希望对从事相关领域研究的同志们有所帮助。

    vb 类似扑克牌算24点小游戏 源代码

    在这个游戏中,玩家需要从四张随机抽取的扑克牌中,通过加、减、乘、除以及括号的操作,使得结果等于24。 描述简洁地提到了这个游戏的核心内容,即它是基于VB的源代码实现。这意味着我们可以看到完整的编程逻辑,...

    vb写的算24点

    24点游戏的基本规则是:从一副扑克牌(去掉大小王)中随机抽出四张牌,用加、减、乘、除、括号等运算方法,使得结果等于24。这个游戏考验玩家的逻辑思维和数学运算能力。 在描述中提到,这个VB程序设计了一个算法来...

    给你四张牌,算初24点

    而"算24点"可能是程序源代码,可能是用Python、Java、C++等语言实现的24点计算程序,通过读取四张牌的值,然后运行程序,输出所有可能的解。 学习和理解24点算法不仅有助于提升数学技能,还能培养编程思维。通过...

    二十四点小游戏源程序

    【二十四点小游戏源程序】是一种基于数学和逻辑思维的娱乐活动,它源于中国的传统益智游戏,玩家需要通过加、减、乘、除运算将四张扑克牌的点数组合成24点。在这个源程序中,我们看到它是用Visual Studio C++编写的...

    Java 解速算24 正解集合

    游戏的目标是通过加减乘除运算(允许使用括号)将给定的四个数字组合成24。在这个问题中,我们需要编写一个程序来判断任意给定的四个数字是否存在解决方案。 首先,我们要明确这个问题的关键在于如何有效地搜索所有...

    二十四点程序源码(java)

    【标题】"二十四点程序源码(java)"所涉及的知识点主要集中在Java编程语言上,特别是关于算法设计和实现的技巧。24点游戏是一个经典的数学和逻辑思维游戏,玩家需要通过加减乘除四则运算将四张牌的数值组合成24。这...

    二十四点源程序

    【二十四点源程序】是一种基于数字游戏的编程项目,它要求玩家通过加、减、乘、除运算在四张扑克牌上找到一个结果为24的计算方法。在这个项目中,我们将探讨游戏的逻辑实现、编程语言的选择以及可能涉及的关键技术。...

    24点算法

    24点游戏,一个深受人们喜爱的智力挑战,它的目标是通过加、减、乘、除四种运算将四张牌的数值组合成24。自动求解24点的问题,实际上就是设计一个算法,能够系统地遍历所有可能的运算路径,找到满足条件的答案。在这...

    关于二十四点游戏的编程思路与基本算法.rar_二十四点_二十四点游戏

    二十四点游戏是一款基于数学逻辑和计算技巧的娱乐活动,它要求玩家从四张1到13的扑克牌中,通过加、减、乘、除运算得出24的结果。在这个问题中,我们将探讨如何利用编程来解决这个问题,以及涉及到的相关算法。 ...

    MFC 24点游戏

    24点游戏是一类经典的数学智力游戏,玩家需要通过四则运算(加、减、乘、除)和括号的合理运用,将给出的四个1到13之间的数字组合成结果为24的算式。这个游戏不仅考验玩家的运算技巧,更是一种逻辑思维和策略的挑战...

Global site tag (gtag.js) - Google Analytics