JAVA實現24點


    最近小馬的老師要求家長陪同小朋友一起算24點,對於培養小學生的數學運算能力以及親子關系,都是一個很不錯的方法。
    在活動中一定要注意由易到難,不要一下子搞的特別復雜和困難,打擊小朋友的積極性。
    為了引導小馬的積極性,我還申請了個微信公眾號,在后台部署了24點的計算程序,其中24點的代碼如下:
 
        
/**
 * Witontek.com.
 * Copyright (c) 2012-2016 All Rights Reserved.
 */
package com.sutong.wechat.demo;

import java.util.ArrayList;
import java.util.List;

import net.sourceforge.jeval.EvaluationException;
import net.sourceforge.jeval.Evaluator;

/**
 * 
 * @author xiaolong.ma
 * @version $Id: Card24.java, v 0.1 2016年8月19日 下午3:33:37 xiaolong.ma Exp $
 */
public class Card24 {

    /**
     * 
     * @param args
     * @throws EvaluationException 
     */
    public static void main(String[] args) throws EvaluationException {
        Card24 c = new Card24();
        c.cards = "4,5,6,7";
        System.out.println(c.calc());

    }

    /**
     * Getter method for property <tt>cards</tt>.
     * 
     * @return property value of cards
     */
    public String getCards() {
        return cards;
    }

    /**
     * Setter method for property <tt>cards</tt>.
     * 
     * @param cards value to be assigned to property cards
     */
    public void setCards(String cards) {
        this.cards = cards;
    }

    private String         cards;

    private List<String>   tempList = new ArrayList<String>();

    private List<String[]> opList   = new ArrayList<String[]>();
    private List<String[]> cardList = new ArrayList<String[]>();

    public String calc() throws EvaluationException {
        //        a1,a2,a3,a4
        //
        //        先排列全
        //        然后,o1,o2,o3 進行排列
        //        最后,括號
        //        (a1,a2)(a3,a4)
        //        a1,a2,a3,a4
        //        (a1,a2)a3,a4
        //        (a1,a2,a3)a4

        String[] arrs = cards.split("\\D");
        if (arrs.length != 4) {
            return "必須為4位";
        }

        //1.全排列
        permCard(arrs, 0, 3);

        String[] ops = { "+", "-", "*", "/" };
        permOp(ops, 0, 3);

        Evaluator eval = new Evaluator();
        for (int i = 0; i < cardList.size(); i++) {

            String[] ta = cardList.get(i);
            for (int j = 0; j < opList.size(); j++) {
                String[] to = opList.get(j);
                List<String> list = create(ta, to);
                for (String s : list) {
                    // Object result = fel.eval(s);

                    String s24 = eval.evaluate(s);
                    float l24 = Float.parseFloat(s24);
                    if (l24 == 24) {
                        return s;
                    }
                }

            }

        }
        return "沒有算出來。。";

    }

    //全排列
    public void permCard(String[] buf, int start, int end) {
        if (start == end) {// 當只要求對數組中一個字母進行全排列時,只要就按該數組輸出即可
            for (int i = 0; i <= end; i++) {
                //System.out.print(buf[i]);
                tempList.add(buf[i]);
            }
            // System.out.println();
            String[] newBuf = new String[4];
            for (int i = 0; i < tempList.size(); i++) {
                newBuf[i] = tempList.get(i);
            }
            cardList.add(newBuf);
            tempList.clear();

        } else {// 多個字母全排列
            for (int i = start; i <= end; i++) {
                String temp = buf[start];// 交換數組第一個元素與后續的元素
                buf[start] = buf[i];
                buf[i] = temp;

                permCard(buf, start + 1, end);// 后續元素遞歸全排列

                temp = buf[start];// 將交換后的數組還原
                buf[start] = buf[i];
                buf[i] = temp;
            }
        }

    }

    //取操作符
    public void permOp(String[] buf, int start, int end) {
        String[] opArr = { "+", "-", "*", "/" };
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                for (int k = 0; k < 4; k++) {
                    String[] newBuf = new String[3];
                    newBuf[0] = opArr[i];
                    newBuf[1] = opArr[j];
                    newBuf[2] = opArr[k];
                    opList.add(newBuf);
                }
            }
        }

    }

    //增加括號
    private List<String> create(String[] ta, String[] to) {

        //        a1,a2,a3,a4
        //        (a1,a2)a3,a4
        //        (a1,a2,a3)a4
        //      (a1,a2)(a3,a4)

        List<String> list = new ArrayList<String>();

        list.add(ta[0] + to[0] + ta[1] + to[1] + ta[2] + to[2] + ta[3]);
        list.add("(" + ta[0] + to[0] + ta[1] + ")" + to[1] + ta[2] + to[2] + ta[3]);
        list.add("(" + ta[0] + to[0] + ta[1] + to[1] + ta[2] + ")" + to[2] + ta[3]);
        list.add("(" + ta[0] + to[0] + ta[1] + ")" + to[1] + "(" + ta[2] + to[2] + ta[3] + ")");
        return list;

    }

}
 
        

 

 
其中進行表達式計算使用了jeval
maven如下:
 
        
<dependency>
    <groupId>net.sourceforge.jeval</groupId>
    <artifactId>jeval</artifactId>
    <version>0.9.4</version>
</dependency>
 
        

 


運算結果:
(5-6+7)*4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM