二十四点:任意给出四个数字,通过加减乘除四则运算得出值为24的算法有多少种。我实现了一个二十四点的算法为对数字和运算符分别两次全排列。详细代码如下:
package myMath.ershisidian;
import itmao.Iershidian;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* ITMAOO
* 2011.12.23
* **/
public class Main {
int count=-1;
double sum=0.00;
Main(int a,int b,int c,int d){
ArrayList array=new ArrayList();
array.add(a);
array.add(b);
array.add(c);
array.add(d);
rankAll(array,new ArrayList());
}
public static void main(String[] args) {
new Main(30,24,8,12);
}
/******
* 全排列算法一,实现数字的全排
* ******/
void rankAll(ArrayList array,ArrayList target){
if(array.size()==0){
Map<Integer,String> outs=new HashMap<Integer,String>();
double[] intArray={Double.valueOf(target.get(0).toString()),
Double.valueOf(target.get(1).toString()),
Double.valueOf(target.get(2).toString()),
Double.valueOf(target.get(3).toString())};
digui(intArray,sum,outs,count);
}
for(int i=0;i < array.size();i++ ){
ArrayList newArray=new ArrayList(array);
ArrayList newtarget=new ArrayList(target);
newtarget.add(newArray.get(i));
newArray.remove(i);
rankAll(newArray,newtarget);
}
}
/******
* 全排列算法二,实现运算符的全排列
* ******/
public void digui(double[] array,double sum,Map outs,int count){
count++;
//处理加法,并递归调用
if(count<=3){
outs.put(count,"+");
digui(array,sum+array[count],outs,count);
// sum=sum-array[count];digui(array,sum);
}
//输出
if(count==4&&sum==24.00){
System.out.println(outs.get(0).toString()+(int)array[0]+outs.get(1).toString()+(int)array[1]+outs.get(2).toString()+(int)array[2]+outs.get(3).toString()+(int)array[3]+"=24");
}
//处理减法,并递归调用
if(count<=3){
outs.remove(count);
outs.put(count, "-");
digui(array,sum-array[count],outs,count);
}
//处理乘法,并递归调用
if(0<count&&count<=3){
outs.remove(count);
outs.put(count, "*");
if(outs.get(count-1).toString().equals("+")){
digui(array,sum-array[count-1]+array[count]*array[count-1],outs,count);
}else if (outs.get(count-1).toString().equals("-")){
digui(array,sum+array[count-1]-array[count]*array[count-1],outs,count);
}else if (outs.get(count-1).toString().equals("*")){
if(outs.get(count-2).toString().equals("+")){
digui(array,sum-array[count-2]*array[count-1]+array[count-2]*array[count-1]*array[count],outs,count);
}else if (outs.get(count-2).toString().equals("-")){
digui(array,sum+array[count-2]*array[count-1]-array[count-2]*array[count-1]*array[count],outs,count);
}else if (outs.get(count-2).toString().equals("*")){
if(outs.get(count-3).toString().equals("+")){
digui(array,array[count-3]*array[count-2]*array[count-1]*array[count],outs,count);;
}else if (outs.get(count-3).toString().equals("-")){
digui(array,-array[count-3]*array[count-2]*array[count-1]*array[count],outs,count);
}
}
}
}
//处理除法,并递归调用
if(1<count&&count<=3){
outs.remove(count);
outs.put(count, "/");
if(outs.get(count-1).toString().equals("+")){
digui(array,sum-array[count-1] + array[count-1]/array[count],outs,count);
}else if (outs.get(count-1).toString().equals("-")){
digui(array,sum+array[count-1] - array[count-1]/array[count],outs,count);
}else if (outs.get(count-1).toString().equals("*")){
if(outs.get(count-2).toString().equals("+")){
digui(array,sum-array[count-2]*array[count-1]+array[count-2]*array[count-1]/array[count],outs,count);
}else if (outs.get(count-2).toString().equals("-")){
digui(array,sum+array[count-2]*array[count-1]-array[count-2]*array[count-1]/array[count],outs,count);
}else if (outs.get(count-2).toString().equals("*")){
if(outs.get(count-3).toString().equals("+")){
digui(array,array[count-3]*array[count-2]*array[count-1]/array[count],outs,count);;
}else if (outs.get(count-3).toString().equals("-")){
digui(array,-array[count-3]*array[count-2]*array[count-1]/array[count],outs,count);
}
}else if (outs.get(count-2).toString().equals("/")){
if(outs.get(count-3).toString().equals("+")){
digui(array,array[count-3]/array[count-2]*array[count-1]/array[count],outs,count);;
}else if (outs.get(count-3).toString().equals("-")){
digui(array,-array[count-3]/array[count-2]*array[count-1]/array[count],outs,count);
}
}
}else if (outs.get(count-1).toString().equals("/")){
if(outs.get(count-2).toString().equals("+")){
digui(array,sum-array[count-2]/array[count-1]+array[count-2]/array[count-1]/array[count],outs,count);
}else if (outs.get(count-2).toString().equals("-")){
digui(array,sum+array[count-2]/array[count-1]-array[count-2]/array[count-1]/array[count],outs,count);
}else if (outs.get(count-2).toString().equals("*")){
if(outs.get(count-3).toString().equals("+")){
sum=array[count-3]*array[count-2]/array[count-1]/array[count];digui(array,sum,outs,count);;
}else if (outs.get(count-3).toString().equals("-")){
sum=-array[count-3]*array[count-2]/array[count-1]/array[count];digui(array,sum,outs,count);
}
}else if (outs.get(count-2).toString().equals("/")){
if(outs.get(count-3).toString().equals("+")){
sum=array[count-3]/array[count-2]/array[count-1]/array[count];digui(array,sum,outs,count);;
}else if (outs.get(count-3).toString().equals("-")){
sum=-array[count-3]/array[count-2]/array[count-1]/array[count];digui(array,sum,outs,count);
}
}
}
}
}
}
分享到:
相关推荐
既可以实现24点游戏,也可以实现其他数值的游戏
Java 二十四点程序是一款基于图形用户界面(GUI)的应用程序,设计用于解决经典的数学游戏——24点。这个游戏的目标是通过加、减、乘、除四种基本运算,使得四个给定的1到13之间的数字组合的结果恰好等于24。程序的...
总的来说,Java实现24点纸牌游戏涉及了随机数生成、数据转换、递归算法、运算符处理以及输出格式化等多个编程概念。这个简单的游戏提供了一个很好的练习平台,可以帮助开发者巩固基础编程技能,同时培养逻辑思维和...
在Java编程语言中实现二十四节气的计算是一项有趣且实用的任务。二十四节气是中国传统历法的重要组成部分,它反映了地球在公转轨道上的位置变化,与农业生产、气候、民俗活动等紧密相关。以下是对这个话题的详细阐述...
Java实现24点游戏知识点 本文主要介绍了Java实现24点游戏的思路和实现方法。该游戏的规则是从扑克中每次取出4张牌,使用加减乘除,第一个能得出24者为赢。下面是Java实现24点游戏的知识点: 1. 随机生成4个代表...
Java实现24点游戏的算法是一项有趣的编程挑战,它涉及到数学、逻辑推理和编程技巧。24点游戏的规则是,给定四个1到13之间的整数,通过加减乘除运算(允许使用括号改变运算顺序)以及可能的数字乘方,使得运算结果...
网上找了些java实现24点小游戏的算法,看了一下,头都晕了! 自己写了一个类,各位可以看一下思路,如果需要的话,只要实例化PointGame类并在构造方法里传递参与计算的四个数字和需要的结果就好了,然后调用get...
将扑克牌(除大小王)随机打乱,每次出现4张卡牌,每张卡牌使用一次,13个回合。 A代表1,J代表11,Q代表12,K代表13。 可2-4人局域网同时在线对战,100秒倒计时结束前回答正确可获得积分,先回答的可获4分,后回答...
这是我们利用java编写的24点小程序,生成的可执行文件。 为了得到一个24点的小游戏,首先我们需要正确的获取外界的输入,包括他们对数字、符号的选择,以及他们提交答案、获取提示等一系列的操作。其次,我们需要对...
【速算24游戏Java实现】是一个编程项目,旨在利用Java语言开发...以上就是速算24游戏Java实现涉及的主要技术点,通过这个项目,开发者不仅可以学习到Java的基础知识,还能提升算法设计、软件工程实践和问题解决的能力。
24点游戏Java实现,界面Javafx实现,一副牌中抽去大小王剩下 52 张(如果初练也可只用 1~10 这 40 张牌),任意抽取 4 张牌 (称牌组),用加、减、乘、除(可加括号)把牌面上的数算成 24。每张牌必须用一次且只能用 一...
【标题】"24点游戏的Java实现"是关于如何使用Java编程语言设计并实现一个经典数学游戏——24点的程序。这个程序的核心目标是根据四张扑克牌上的数字,通过加减乘除和括号运算,找到使得运算结果为24的计算方法。 ...
Java 速算24点程序是一种利用编程技术实现的数学游戏,它基于经典的24点游戏规则,通过算法解决给定的四张扑克牌(数字1到9)如何通过加、减、乘、除运算得到24的计算问题。在这个程序中,我们将深入探讨Java编程...
想知道面试题中5 5 5 1如何算出24点吗? 6 1 1 4居然可以(6/((1/1)/4))算24点!总共有228中不同方法! 试一下这个计算24点的小程序吧。 你可以自己研究一下开源算法。 请提宝贵意见,谢谢你对我的支持!
在编程领域,"24点计算"是一个经典的算法问题,主要目标是利用...总的来说,24点计算的Java实现涉及到算法设计、递归、条件判断、数值运算等多个方面的知识,是一个很好的编程实践案例,有助于提升编程能力和逻辑思维。
《Java实现24点游戏详解》 24点游戏是一种广受欢迎的数学智力游戏,它源于中国的算术游戏,目标是通过加、减、乘、除四种运算,将四张扑克牌上的数字组合成24。Java作为一种强大的编程语言,非常适合用来实现这种...
【标题】"二十四点程序源码(java)"所涉及的知识点主要集中在Java编程语言上,特别是关于算法设计和实现的技巧。24点游戏是一个经典的数学和逻辑思维游戏,玩家需要通过加减乘除四则运算将四张牌的数值组合成24。这...
Java实现的点对点短消息发送协议(smpp)开发包源码.rar Java实现的视频播放程序源码.rar Java实现移动的遮照效果.rar JAVA实现超级玛丽.zip Java实现跟踪鼠标运行坐标的源码.rar Java手机与计算机互发彩信源码.rar ...
标题中的“24点程序(没有重复,括号显示完美)”指的是一个使用Java编程语言实现的游戏程序,它能够解决经典的数学游戏——24点。在这个游戏中,玩家需要使用加、减、乘、除四种基本运算,以及括号来重新排列四个...