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)"执行流)。

24点游戏c语言链表做法,解24点相关推荐

  1. 24点游戏c语言链表做法,C语言实现24点程序(示例代码)

    一.简介 本程序的思想和算法来自于C语言教材后的实训项目,程序通过用户输入四个整数计算出能够通过加减乘除得到数字24的所有表达式,程序的设计有别于一般通过穷举实现的方式,效率得到提高.算法介绍如下: ...

  2. 24点游戏c语言程序代码,C语言实现24点游戏源代码

    本文实例为大家分享了C语言实现24点游戏的具体代码,供大家参考,具体内容如下 将算法实现改成C语言,并可在linux服务器上运行.同时修改为可显示所有结果. 注:如果传参重复,如4,4,7,7这样,会 ...

  3. 24点游戏——C语言纯代码及MFC风格

    1.实验目的 a.24点游戏是经典的纸牌益智游戏,请完成它. 2.题目描述 从扑克中每次取出4张牌.使用加减乘除,第一个能得出24者为赢.(其中,J代表11,Q代表12,K代表13,A代表10),按照 ...

  4. python二十四点_python实现24点游戏(地球上最短的24点游戏代码?)

    牛bi要挑大的吹,否则看帖的人没几个. 所谓24点游戏,就是4个数字和算符的排列组合: 四个里挑两个P(4,2) 计算:四个算符 四个里剩余两个+计算结果,三个里挑两个P(3,2) 计算:四个算符 经 ...

  5. 推荐一个和孩子玩24点游戏的工具:益乐24点

    最近完成了一个小工具,可以帮助家长们和孩子一起玩24点游戏,要封版本了,记录如下: 所有工作包括: 自动求24点算法 ,采用了递归算法 一个网站,不多说, 请直接看内容:益乐24点 一个微信小程序 微 ...

  6. html 计算24点游戏,0048 JavaScript编程实现算24点游戏

    原标题:0048 JavaScript编程实现算24点游戏 上节课在网页上使用Java实现了根据输入日期计算星座的程序. 这节课来做一个算24点游戏,主要是练习使用Java来控制网页元素. 程序设计思 ...

  7. 24点游戏c语言去除重复,C语言解24点游戏程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 前几天在微博上看到24点的游戏,6 6 6 10.算了很久是在算不出来,最后我想我何不写一个小程序解决它?说做就做,我刚开始的想法很简单,就是列举4个数的 ...

  8. 24点游戏c语言源代码6,C语言解24点游戏程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 前几天在微博上看到24点的游戏,6 6 6 10.算了很久是在算不出来,最后我想我何不写一个小程序解决它?说做就做,我刚开始的想法很简单,就是列举4个数的 ...

  9. c语言简单的24点游戏,C语言解24点游戏程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 前几天在微博上看到24点的游戏,6 6 6 10.算了很久是在算不出来,最后我想我何不写一个小程序解决它?说做就做,我刚开始的想法很简单,就是列举4个数的 ...

最新文章

  1. 35国,14年,世界最大科学项目,「人造太阳」即将诞生!
  2. php 模块指令,php artisan module常用命令
  3. Python中有几种办法交换两个变量的值?
  4. [云炬创业基础笔记]第十一章创业计划书测试10
  5. antd-react-mobile(踩坑记录)
  6. golang mysql分表_go分库分表 主从分离例子
  7. Docker学习总结(8)——利用Docker开启持续交付之路
  8. 随想录(文件系统的第一个用户程序shell)
  9. php 转通达信数据格式,通达信数据格式
  10. bat ping 返回值_清清楚楚玩游戏!10.10版本,赛娜被动层数可以ping给队友看了
  11. 2. 知识图谱-命名实体识别(NER)详解
  12. qq微信连不上服务器6,手机wifi连接上了只有QQ微信能联网其他软件都上不了网是什么原因...
  13. Halcon 3D 计算3D模型的3D表面法线
  14. 如何截图一张完整的表_表格太长怎么截图
  15. 信鸽推送(Android和iOS):详细流程+问题解决
  16. Jlink接口引脚定义
  17. 滑动验证码破解—python—以某东网站为例
  18. Python进行图片文字识别(表格图片)(使用阿里OCR接口)
  19. 在html页面添加了评论和回复的显示页面
  20. 易软通WMS仓储管理系统介绍

热门文章

  1. php网站模板怎么修改,网站后台模板修改
  2. Java实战项目视频!群晖docker下载
  3. 代码工人还是程序员?
  4. spring、mybatis、mybatis-spring 版本对应
  5. 《Spring实战》读书笔记_装配bean
  6. Git使用方法技巧大全
  7. F429/439 SDRAM is42s16-8Mbyte
  8. 2012年3月5日有感
  9. 本特利探头330103-00-12-50-02-00本特利联接电缆9571-20本特利传感器9200-03-02-10-00
  10. 自学(网站制作,FLASH,PS,3D)一定要看