24点游戏算法
现在我们在做一个24点的小游戏,我主要负责算法部分,前面有章博客已经讲解了加括号的四则表达式的计算算法,现在要解决就是24点的算法。
24点游戏的说明:
54张牌去掉大小王2张牌,剩余52张。任意发1-K之间的4个张牌(也就是有1-13的四个数字),用+-*/()连结成算式,使得式子的计算结果为24.
算法描述
24点的算法还处比较复杂的,网上有各种别人写的现成代码,大部分都写的不太好。
主要的思想是:穷举法,列举出所有4个数字+3个运算符+括号的组合;在计算的过程利用剪枝把一些不可能的情况去除掉。
网上有很多算法,主要来讲一下,像以下有几个比较一下。
如:http://843788041.iteye.com/blog/1117558
这种方式没有考虑加括号的情况,不能很好地解决问题
再有:http://www.iteye.com/topic/312476
还是没有完整地解决问题,这里只对前两个数及后两个数进行了加括号,即先计算两个数,再计算后两个数,最后把两个结果进行计算。没有计算的顺序和加括号。
后够还是找到一种比较好的解决方案,基本上可以解决的问题。这算法逻辑比较复杂,但是基本都看懂了,既然已经别人都已经写好了,我就不再花时间了,直接贴代码吗。
/**
* 他的主要想法是
* 先对四个数中的任意两个数进行四则运算,得到的结果加剩余的两个数还有三个数
* 再对三个数中的任意两个数进行四则运算,得到的结果加剩余的一个数还有二个数
* 再对剩余的两个数进行四则运算,得到的结果如果是24,就说明该表达式能得到24,表达式正确;
* 如果结果不是24,则说明表达式不正确
* @param n
* @return
*/
public boolean is24(int n) {
if (n == 1)
return (Math.abs(number[0] - 24) < EPISON);
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) { // 进行组合
double a, b;
String expa, expb;
a = number[i]; // 保存起来,在方法最后再恢复,以便继续计算
b = number[j]; // 保存起来,在方法最后再恢复,以便继续计算
number[j] = number[n - 1]; // 将最后一个数挪过来
expa = exp[i]; // 保存起来,在方法最后再恢复,以便继续计算
expb = exp[j]; // 保存起来,在方法最后再恢复,以便继续计算
exp[j] = exp[n - 1]; // 将最后一个式子挪过来j'
exp[i] = "(" + expa + "+" + expb + ")"; // 看看加法能否算出,如果能算出,返回true
number[i] = a + b;
if (is24(n - 1))
return true;
exp[i] = "(" + expa + "-" + expb + ")"; // 看看减法能否算
number[i] = a - b;
if (is24(n - 1))
return true;
exp[i] = "(" + expb + "-" + expa + ")";
number[i] = b - a;
if (is24(n - 1))
return true;
exp[i] = "(" + expa + "*" + expb + ")"; // 看看乘法能否算
number[i] = a * b;
if (is24(n - 1))
return true;
if (b != 0) {
exp[i] = "(" + expa + "/" + expb + ")"; // 看看除法能否算
number[i] = a / b;
if (is24(n - 1))
return true;
}
if (a != 0) {
exp[i] = "(" + expb + "/" + expa + ")";
number[i] = b / a;
if (is24(n - 1))
return true;
}
//如果以上的加、减、乘、除都不能得到有效的结果,则恢复数据进行下一轮的计算。
number[i] = a; // 恢复
number[j] = b;
exp[i] = expa;
exp[j] = expb;
}
}
return false;
}
循环的过程如下
分享到:
相关推荐
在提供的压缩包中,"24点.pptx"可能是关于24点游戏算法的详细讲解或示例,"cppunit-1.12.1"是一个C++测试框架,可能用于编写和测试算法代码,"project"和"testcase"可能包含了项目的源码和测试用例,而"source"可能...
24点游戏是一种深受人们喜爱的智力挑战游戏,它的目标是通过加、减、乘、除运算,将给出的四个1到13之间的数字组合成24。这个游戏考验玩家的逻辑思维和数学技能。本文将深入探讨24点游戏的算法实现,并提供详细的...
【原创】2010年全国软件专业人才设计与开发大赛决赛样题 -- 24点小游戏算法 网上找了些java实现24点小游戏的算法,看了一下,头都晕了! 自己写了一个类,各位可以看一下思路,如果需要的话,只要实例化PointGame...
24点游戏是一种广受欢迎的智力游戏,玩家需要在四张扑克牌中通过加减乘除运算找出一种或多种方式使结果等于24。在这个场景中,我们关注的是"24点算法的实现",这涉及到编程技术,尤其是C++语言,以及可能用到的图形...
通过上述分析,我们可以看到24点游戏算法的设计和实现涵盖了递归、回溯、搜索、数据结构、枚举、优化策略以及面向对象设计等多个计算机科学的核心概念。理解并实现这样的算法,不仅可以锻炼我们的逻辑思维能力,也是...
24点牌js算法,24点牌js算法,24点牌js算法
通常,24点游戏会给玩家四张1到13之间的扑克牌,目标是通过加、减、乘、除(可使用括号改变运算顺序)来得到24的结果。算法需要遍历所有可能的运算组合,并检查是否能得出24。这需要对数字的排列组合有深入的理解,...
为了实现完整的24点游戏算法,还需要实现以下关键功能: 1. **生成所有可能的组合**:这涉及到对数字和符号进行排列组合,同时考虑运算符的优先级。 2. **计算表达式**:使用`Evaluate()`方法对构建的表达式进行求...
24点游戏是一种数学游戏,通常由四张扑克牌组成,玩家需要利用加、减、乘、除(每张牌只能用一次)来使结果等于24。以下是对这段代码的关键知识点进行详细解析。 ### 24点算法核心概念 1. **基本思路**:该算法...
在解决二十四点游戏的过程中,我们需要掌握一些基本的算法策略。首先,可以尝试对四张牌进行两两组合,看是否能得到12或者12的倍数,因为24是12的两倍。例如,可以先计算两个数的乘积,如果得到的乘积是12或其倍数,...
24点算法C语言程序,可以随机生成4个数字,然后都可以让计算机解答。自己都可以输入数据解答。
标题中的“24点算法及程序”指的是一个数学游戏,玩家需要从四张包含1到13的扑克牌中,通过加、减、乘、除和括号的操作,使得计算结果等于24。这个概念在计算机编程中可以转化为一个算法问题,即编写一个程序来自动...
24点游戏算法Java源码 80年代全世界流行一种数字游戏,在中国我们把这种游戏称为“24点”。现在我们 把这个有趣的游戏推广一下:您作为游戏者将得到6个不同的自然数作为操作数, 以及另外一个自然数作为理想目标...
二十四点游戏是一款基于数学逻辑和计算技巧的娱乐活动,它要求玩家从四张1到13的扑克牌中,通过加、减、乘、除运算得出24的结果。在这个问题中,我们将探讨如何利用编程来解决这个问题,以及涉及到的相关算法。 ...
### C语言原程序二十四点游戏的编程思路与基本算法 #### 一、二十四点游戏简介 二十四点游戏是一种数学益智游戏,玩家需要利用给定的四张牌(每张牌上的数字范围一般为1至13),通过加、减、乘、除四种运算(可以...
24点算法是一种经典的数学游戏,源自中国的扑克牌游戏,目标是通过加减乘除运算,使四张1到13之间的数字牌得出24。在编程领域,我们可以用C#来实现这个算法,将其转化为计算机可以处理的问题。下面将详细探讨如何用...
24点游戏,作为一个经典而富有挑战性的数学游戏,深受广大玩家喜爱。它基于四则运算,通过加、减、乘、除运算,使得四个给定的自然数(通常是1到13之间)组合运算后得到结果为24。本文将深入探讨24点算法,并结合...
"计算24点"是一个经典的数学游戏,挑战玩家利用加减乘除运算符以及括号,将四张扑克牌上的数字组合成24。在这个问题中,我们要讨论的是实现这个功能的算法,即如何设计一个程序自动找到这些计算公式。 首先,我们...
【二十四点游戏】是一种经典的数学智力游戏,玩家需要利用加减乘除运算,将四张牌上的数字组合成24。这个游戏对玩家的逻辑思维、数学运算能力有很好的锻炼作用。在编程领域,实现24点游戏算法是一个有趣的挑战。 ...
24点游戏Java实现,界面Javafx实现,一副牌中抽去大小王剩下 52 张(如果初练也可只用 1~10 这 40 张牌),任意抽取 4 张牌 (称牌组),用加、减、乘、除(可加括号)把牌面上的数算成 24。每张牌必须用一次且只能用 一...