24点游戏

24点游戏是经典的纸牌益智游戏。
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风格良好(使用自定义注释模板)
2.列出表达式无重复。
程序流程图
24点游戏

程序运行结果
可以组成24点
24点游戏
不能组成24点、
24点游戏
源代码

import java.util.Random;
import java.util.ArrayList;

public class Game {

    public static void main(String[] args) {
        Experssion exp = new Experssion();
        Thinker ti = new Thinker(exp);
        ArrayList<Integer> card = new ArrayList<Integer>();//存放随机生成的四个数
        int sum = 24;
        Random random=new Random();
        int t;
        for (int i = 1; i < 5; i++) {
            t = 1+random.nextInt(12);
            System.out.println("输出的第"+i+"张牌为"+t);
            card.add(t);
        }
        ti.count(card, card.size() - 1, sum);
    }
}

class Experssion {
    //定义存放数字和符号的集合
    private ArrayList<Integer> num = new ArrayList<Integer>();
    private ArrayList<String> sign = new ArrayList<String>();
    //向数字集合里添加数字
    public void add(int n) {
        num.add(n);
    }
    //向符号集合里添加符号
    public void add(String s) {
        sign.add(s);
    }
    //优先级判断 :   +,-返回1  */返回2
    private int getPriority(String s) {
        if (sign.equals("+")) return 1;
        if (sign.equals("-")) return 1;
        if (sign.equals("*")) return 2;
        if (sign.equals("/")) return 2;
        return -1;
    }
    //
    private String toString(int la) {
        if (la == 0) {
            return num.get(0) + sign.get(0) + num.get(1);//输出前两个数字的运算
        } else {
            String result = this.toString(la - 1);
            if (getPriority(sign.get(la)) >= getPriority(sign.get(la - 1)))
                result = "(" + result + ")";
            result += sign.get(la) + num.get(la + 1);
            return result;
        }
    }

    public String toString() {
        return toString(2);
    }
//清空集合
    public void clear() {
        num.clear();
        sign.clear();
    }
}

class Thinker {
    private Experssion exp;

    public Thinker(Experssion expp) {
        exp = expp;
    }

    /**
     *
     * @param array 计算的四位数
     * @param num   长度-1
     * @param target  结果24
     * @return
     */
    public boolean count(ArrayList<Integer> array, int num, int target) {
    	//计算两个数的四则运算结果
        if (num == 1) {
            if (array.get(0) + array.get(1) == target) {
                exp.add(array.get(0));
                exp.add(array.get(1));
                exp.add("+");
                return true;
            }
            if (array.get(0) - array.get(1) == target) {
                exp.add(array.get(0));
                exp.add(array.get(1));
                exp.add("-");
                return true;
            }
            if (array.get(1) - array.get(0) == target) {
                exp.add(array.get(1));
                exp.add(array.get(0));
                exp.add("-");
                return true;
            }
            if (array.get(0) * array.get(1) == target) {
                exp.add(array.get(1));
                exp.add(array.get(0));
                exp.add("*");
                return true;
            }
            if (array.get(0) * target == array.get(1)) {
                exp.add(array.get(0));
                exp.add(array.get(1));
                exp.add("/");
                return true;
            }
            if (array.get(1) * target == array.get(0)) {
                exp.add(array.get(1));
                exp.add(array.get(0));
                exp.add("/");
                return true;
            }
            return false;
        } else {
            for (int current = 0; current < array.size(); current++) {
                ArrayList<Integer> array1 = new ArrayList<Integer>();
                int currentNum = array.get(current);//将array中的第一个数取出
                for (int i = 0; i < array.size(); i++) {
                    if (i != current) {
                        array1.add(array.get(i));//将array剩下的三个数放到array1里
                    }
                }
                if (count(array1, num - 1, target - currentNum)) {
                    exp.add("+");
                    exp.add(currentNum);
                    if (num == 3) {
                        System.out.println(exp.toString());
                        exp.clear();
                    }
                    else {
                    	return true;
                    } 
                }
                if (count(array1, num - 1, target + currentNum)) {
                    exp.add("-");
                    exp.add(currentNum);
                    if (num == 3) {
                        System.out.println(exp.toString());
                        exp.clear();
                    }
                    else {
                    	return true;
                    }
                }
                if (count(array1, num - 1, target * currentNum)) {
                    exp.add("/");
                    exp.add(currentNum);
                    if (num == 3) {
                        System.out.println(exp.toString());
                        exp.clear();
                    }
                    else {
                    	return true;
                    }
                }
                if (target % currentNum == 0) {
                    if (count(array1, num - 1, (int) (target / currentNum))) {
                        exp.add("*");
                        exp.add(currentNum);
                        if (num == 3) {
                            System.out.println(exp.toString());
                            exp.clear();
                        }
                        else {
                        	return true;
                        }
                    }
                }
            }
            
            return false;
        }
    }

}