`
shuiguaiQQ
  • 浏览: 14538 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

自己实现的java算24点

    博客分类:
  • Java
阅读更多

转载请注明出处:http://shuiguaiqq.iteye.com/blog/2064339

网上找的那些都看不懂,要么就是不完整,所以自己动手写了下,代码如下:

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Calculate24 {
    static List<Node> result = new ArrayList<Node>();
    static Set<String> calculateSet = new HashSet<String>();
    public static void main(String[] args) {
        Date now = new Date();
        int[] values = {3,3,8,8};
        traverse(values); 
        System.out.println("共耗时: "+(System.currentTimeMillis()-now.getTime())+" 毫秒");
    }
    
    public static void traverse(int[] a){
        if(a.length!=4){
            System.out.println("不得多于或少于4个数");
            return;
        }
        Double[] dArrays = new Double[4];
        dArrays[0] = a[0]+0D;
        dArrays[1] = a[1]+0D;
        dArrays[2] = a[2]+0D;
        dArrays[3] = a[3]+0D;
        List<Node> headerList = null;
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                if(j==i){
                    continue;
                }
                for(int k=0;k<4;k++){
                    if(k==i || k==j){
                        continue;
                    }
                    headerList = createHeaderList(dArrays[i],dArrays[j]);
                    List<Node> chooseThreeNum = null;
                    for(Node t:headerList){
                        chooseThreeNum = chooseThreeOrFourNum(t, dArrays[k]);
                        List<Node> chooseFourNum = null;
                        for(Node temp:chooseThreeNum ){
                            chooseFourNum = chooseThreeOrFourNum(temp,dArrays[6-(i+j+k)]);
                            pickNode(chooseFourNum);
                        }
                    }
                }
            }
        }
        getAllCalculate();
        if(calculateSet.size()>0){
            display();
        }      
    }
    
    private static void display(){
        System.out.println("共有解:"+calculateSet.size()+"个,具体如下:");
        for(String s:calculateSet){
            System.out.println(s+" = 24");
        }
    }
    
    private static void getAllCalculate(){
        if(result.size()<1){
            System.out.println("无解");
        }
        Node second = null;
        Node first = null;
        for(Node t:result){
            second = t.getPre_node();
            first = second.getPre_node();
            if(second.get_a().doubleValue()==first.getValue().doubleValue()){
                second.setA_cul_str(first.getCul_str());              
            }else{
                second.setB_cul_str(first.getCul_str());    
            }
            second.doCalculate();
            
            if(t.get_a().doubleValue()==second.getValue().doubleValue()){
                t.setA_cul_str(second.getCul_str());              
            }else{
                t.setB_cul_str(second.getCul_str());    
            }
            t.doCalculate();
            calculateSet.add(filterCalculate(t.getCul_str()));
            
        }
    }
    
    private static String filterCalculate(String str){
        str = str.substring(1, str.length()-1);
        str = str.replace(".0", "");
        str = str.replace("*", "×");
        str = str.replace("/", "÷");
        return str;
    }
    
    private static void pickNode(List<Node> list){
        for(Node t : list){
            if(judge24(t.getValue())){
                result.add(t);
            }
        }
    }
    
    private static boolean judge24(Double d){
        if(Math.abs(d.doubleValue()-24)<=0.000001){
            return true;
        }
        return false;
        
    }
    private static List<Node> chooseThreeOrFourNum(Node t,Double b){
        List<Node> result = new ArrayList<Node>();
        Double a = t.getValue();
        Node n1 = new Node(a,b,'+');
        Node n2 = new Node(a,b,'-');
        Node n3 = new Node(a,b,'-',true);
        Node n4 = new Node(a,b,'*');
        Node n5 = new Node(a,b,'/');
        Node n6 = new Node(a,b,'/',true);
        n1.doCalculate();
        n2.doCalculate();
        n3.doCalculate();
        n4.doCalculate();
        n5.doCalculate();
        n6.doCalculate();
        insertNode(n1,result);
        insertNode(n2,result);
        insertNode(n3,result);
        insertNode(n4,result);
        insertNode(n5,result);
        insertNode(n6,result);
        n1.setPre_node(t);
        n2.setPre_node(t);
        n3.setPre_node(t);
        n4.setPre_node(t);
        n5.setPre_node(t);
        n6.setPre_node(t);    
        return result;
    }
    
    private static List<Node> createHeaderList(Double a,Double b){
        List<Node> result = new ArrayList<Node>();
        Node n1 = new Node(a,b,'+');
        Node n2 = new Node(a,b,'-');
        Node n3 = new Node(a,b,'-',true);
        Node n4 = new Node(a,b,'*');
        Node n5 = new Node(a,b,'/');
        Node n6 = new Node(a,b,'/',true);
        n1.doCalculate();
        n2.doCalculate();
        n3.doCalculate();
        n4.doCalculate();
        n5.doCalculate();
        n6.doCalculate();
        insertNode(n1,result);
        insertNode(n2,result);
        insertNode(n3,result);
        insertNode(n4,result);
        insertNode(n5,result);
        insertNode(n6,result);
        return result;
    }
    
    
    private static void insertNode(Node p,List<Node> list){
        if(p.getValue()!=null){
            list.add(p);
        }
    }
    
}

class Node {
    Double _a;
    Double _b;
    char opr;
    Double value;
    boolean is_rev_order;
    String a_cul_str;//_a的算式
    String b_cul_str;//_b的算式
    String cul_str;//自身的算式
    Node pre_node;
    Node next_branch1;
    Node next_branch2;
    Node next_branch3;
    Node next_branch4;
    Node next_branch5;
    Node next_branch6;

    public Node(Double a, Double b, char opr) {
        this._a = a;
        this._b = b;
        this.opr = opr;
        this.a_cul_str = Double.toString(_a);
        this.b_cul_str = Double.toString(_b);
    }

    public Node(Double a, Double b, char opr, boolean is_rev_order) {
        this._a = a;
        this._b = b;
        this.opr = opr;
        this.is_rev_order = is_rev_order;
        this.a_cul_str = Double.toString(_a);
        this.b_cul_str = Double.toString(_b);
    }

    public Double getValue(){
        return value;
    }
    public void doCalculate(){
        switch(opr){
        case '+':
            cul_str = "("+a_cul_str+"+"+b_cul_str+")";
            value = _a+_b;
            break;
        case '-':
            if(is_rev_order){
                cul_str = "("+b_cul_str+"-"+a_cul_str+")";
                value = _b-_a;
            }else{
                cul_str = "("+a_cul_str+"-"+b_cul_str+")";
                value = _a-_b;
            }
            break;
        case '*':
            cul_str = "("+a_cul_str+"*"+b_cul_str+")";
            value = _a*_b;
            break;
        case '/':
            if(is_rev_order){
                if(_a!=0){
                    cul_str = "("+b_cul_str+"/"+a_cul_str+")";
                    value = _b/_a;
                }
               
            }else{
                if(_b!=0){
                    cul_str = "("+a_cul_str+"/"+b_cul_str+")";
                    value = _a/_b;
                }
            }
            break;
        }
    }
    
    public Double get_a() {
        return _a;
    }

    public void set_a(Double _a) {
        this._a = _a;
    }

    public Double get_b() {
        return _b;
    }

    public void set_b(Double _b) {
        this._b = _b;
    }

    public String getA_cul_str() {
        return a_cul_str;
    }

    public void setA_cul_str(String a_cul_str) {
        this.a_cul_str = a_cul_str;
    }

    public String getB_cul_str() {
        return b_cul_str;
    }

    public void setB_cul_str(String b_cul_str) {
        this.b_cul_str = b_cul_str;
    }

    public String getCul_str() {
        return cul_str;
    }

    public void setCul_str(String cul_str) {
        this.cul_str = cul_str;
    }

    public Node getPre_node() {
        return pre_node;
    }

    public void setPre_node(Node pre_node) {
        this.pre_node = pre_node;
    }

    public Node getNext_branch1() {
        return next_branch1;
    }

    public void setNext_branch1(Node next_branch1) {
        this.next_branch1 = next_branch1;
    }

    public Node getNext_branch2() {
        return next_branch2;
    }

    public void setNext_branch2(Node next_branch2) {
        this.next_branch2 = next_branch2;
    }

    public Node getNext_branch3() {
        return next_branch3;
    }

    public void setNext_branch3(Node next_branch3) {
        this.next_branch3 = next_branch3;
    }

    public Node getNext_branch4() {
        return next_branch4;
    }

    public void setNext_branch4(Node next_branch4) {
        this.next_branch4 = next_branch4;
    }

    public Node getNext_branch5() {
        return next_branch5;
    }

    public void setNext_branch5(Node next_branch5) {
        this.next_branch5 = next_branch5;
    }

    public Node getNext_branch6() {
        return next_branch6;
    }

    public void setNext_branch6(Node next_branch6) {
        this.next_branch6 = next_branch6;
    }

}

 

1
0
分享到:
评论

相关推荐

    java实现二十四节气计算

    总之,实现Java版的二十四节气计算涉及到对日期处理、天文知识和编程技巧的综合运用。这不仅有助于提升编程能力,还能增进对中国传统文化的理解。通过阅读提供的源码和公式文档,我们可以进一步学习和改进这种实现。

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

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

    Java 实现24点游戏

    既可以实现24点游戏,也可以实现其他数值的游戏

    24点小游戏的可执行文件 - java

    这是我们利用java编写的24点小程序,生成的可执行文件。 为了得到一个24点的小游戏,首先我们需要正确的获取外界的输入,包括他们对数字、符号的选择,以及他们提交答案、获取提示等一系列的操作。其次,我们需要对...

    java 速算24点程序

    Java 速算24点程序是一种利用编程技术实现的数学游戏,它基于经典的24点游戏规则,通过算法解决给定的四张扑克牌(数字1到9)如何通过加、减、乘、除运算得到24的计算问题。在这个程序中,我们将深入探讨Java编程...

    24点游戏的java实现

    【标题】"24点游戏的Java实现"是关于如何使用Java编程语言设计并实现一个经典数学游戏——24点的程序。这个程序的核心目标是根据四张扑克牌上的数字,通过加减乘除和括号运算,找到使得运算结果为24的计算方法。 ...

    24点游戏Java实现

    24点游戏Java实现,界面Javafx实现,一副牌中抽去大小王剩下 52 张(如果初练也可只用 1~10 这 40 张牌),任意抽取 4 张牌 (称牌组),用加、减、乘、除(可加括号)把牌面上的数算成 24。每张牌必须用一次且只能用 一...

    24点计算java实现

    在编程领域,"24点计算"是一个经典的算法问题,主要目标是利用...总的来说,24点计算的Java实现涉及到算法设计、递归、条件判断、数值运算等多个方面的知识,是一个很好的编程实践案例,有助于提升编程能力和逻辑思维。

    二十四点程序源码(java)

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

    速算24游戏Java实现

    【速算24游戏Java实现】是一个编程项目,旨在利用Java语言开发...以上就是速算24游戏Java实现涉及的主要技术点,通过这个项目,开发者不仅可以学习到Java的基础知识,还能提升算法设计、软件工程实践和问题解决的能力。

    Java课程设计 速算二十四点

    在本Java课程设计中,我们将探讨“速算二十四点”这一趣味性数学游戏的编程实现。这个游戏的目标是从四张包含1到13数字的扑克牌中,通过加、减、乘、除运算,使得结果等于24。在这个项目中,我们将学习如何运用Java...

    Java的24点游戏

    这是Java开发的24点游戏,游戏能随机显示4位数字,并且有抽取按钮,好像抽奖一样抽取。并且有游戏计时器和游戏计分器。...最主要的帮助按钮,采用了分治递归的算法实现,能够把所有24点组合算出,帮助玩家查看答案!

    java速算24点游戏课设报告+源码

    第二章 系统需求分析 2.1 引言 2.2 游戏需求 2.3基本步骤 2.4基本要求  2.4.1 输入输出要求 2.4.2 设计要求 2.5 软硬件需求 2.6 接口控制 2.7 需求方案论证 第三章 系统概要设计 3.1 程序首页界面设计  3.2 程序...

    【算24点】游戏Java源码【有注释】

    【算24点】游戏是基于数学和策略的娱乐活动,玩家通常使用四张1-13的扑克牌,通过加、减、乘、除、括号等操作尝试计算出结果为24。在这个Java实现的版本中,我们可以通过源码来深入理解其算法和编程技巧。 首先,...

    java24点的算法

    总结来说,实现Java24点算法的关键在于理解游戏规则,设计合适的递归函数和运算组合策略,并处理好运算顺序。这不仅锻炼了编程能力,也对数学思维和逻辑推理有所提升。通过这样的实践,开发者能够更好地理解和掌握...

    java游戏24点源代码

    【描述】中的“java做的24点小游戏源代码,很好的小东东”意味着这个源代码是一个用Java实现的24点游戏小程序,它可能包含了游戏的基本规则、算法实现以及用户交互界面。开发者或学习者可以通过阅读和分析这段源码来...

    java 24点小游戏算法

    网上找了些java实现24点小游戏的算法,看了一下,头都晕了! 自己写了一个类,各位可以看一下思路,如果需要的话,只要实例化PointGame类并在构造方法里传递参与计算的四个数字和需要的结果就好了,然后调用get...

    Java自制24点小游戏

    【Java自制24点小游戏】是一款适合初学者练习编程技能的项目,尤其对正在学习Java编程的新人来说,这是一个很好的实战案例。通过实现这个小游戏,开发者可以深入理解面向对象编程、控制流、数学逻辑以及用户交互等...

    24点程序(没有重复,括号显示完美)

    标题中的“24点程序(没有重复,括号显示完美)”指的是一个使用Java编程语言实现的游戏程序,它能够解决经典的数学游戏——24点。在这个游戏中,玩家需要使用加、减、乘、除四种基本运算,以及括号来重新排列四个...

    算24点 java 编译成exe

    标题中的“算24点”是指一种数学游戏,玩家需要使用四张扑克牌上的数字,通过加、减、乘、除、括号等运算来得到结果24。在这个上下文中,我们讨论的是一个使用Java编程语言开发的GUI(图形用户界面)程序,它实现了...

Global site tag (gtag.js) - Google Analytics