内容:
24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。
提高要求:用户初始生命值为一给定值(比如3),初始分数为0。随机生成4个代表扑克牌牌面的数字或字母,由用户输入包含这4个数字或字母的运算表达式(可包含括号),如果表达式计算结果为24则代表用户赢了此局。
1. 程序风格良好(使用自定义注释模板)
2.使用计时器要求用户在规定时间内输入表达式,如果规定时间内运算正确则加分,超时或运算错误则进入下一题并减少生命值(不扣分)。
3.所有成绩均可记录在TopList.txt文件中。
算法分析
算法思路
- 用户需要提前输入4个数,作为凑成24点的基数,构成arr数组,从而求解目标数T=24。
- 在数arr中,首先取两个数与操作符集合进行组合,分别得到一组表达式,对于新得到的每个表达式,都可以和原集合中剩下的元素,组合成新的集合组,将每次得到的表达式,都用"()"包住,以保证计算先后顺序。
- 对集合中所有元素进行两两组合,并与剩余元素形成新的集合。由此,我们得到了一组元素为k-1个的集合组
- 对新集合组中的每一个集合,重复以上1-3步,可得到一组包含k-2个元素的集合组...以此类推,最后会得到一组集合,其中每个集合都只包含一个元素,这个就是我们合成的最终表达式.对第四步得到的表达式集合进行求解,判断其是否等于目标数24,将符合条件的过滤出来,即得到所有满足条件的表达式。
概要设计
主函数程序流程图
测试测试:
测试用例:2 8 10 4
测试结果:
可以看到,程序成功的生成了对应测试用例的结果,结果是正确的。
测试无法组成24点的数据:7 13 1 6
经过多次运行, 7,13,1,6这四个数据,无法组成24点,程序输出No answer运行正确。
心得体会
对递归算法有了更深的了解,通过程序代码的方式实现了24点游戏的基本算法,非常有意思。在解决bug的过程中,我体会到将书本上的知识点,在实际操作中应用的感受,这加深了我对编程这方面的感悟。