打印出一副扑克牌中,加减乘除等于24的所有解

这个题是我今天笔试中遇到的一道题目,蛮有意思的,记录一下:

经过穷举计算,共计是98530929486种解法。。。

 

package factory;

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

public class Poker24 {
    static List<PokerCardDTO> pokerCardsList = new ArrayList<>();
    static int n = 4;//运算次数标记
    static int[] A = new int[4];//存放四个数字
    static String[] B = new String[4];//存放字符串型的四个数字,也存放表达式
    static int simpleCount = 0;//单次计数
    static Long allCount = 0L; //全部计数
    public static void calculate4Times(int n) {
        //判断是否已完成三次运算
        if(n == 1)
            if(A[0] == 24) {//A[0]里面存放的最后的结果
                System.out.println(B[0]);//B[0]存放的结果表达式
                simpleCount++;
                allCount = allCount + Long.valueOf(simpleCount);
            }
            else {//空的不做处理进行下一条语句

            }
        //从数组中任意取出俩个数的组合
        for(int i = 0;i < n;i++) {
            for(int j = i + 1;j < n;j++) {
                int a,b;
                String x,y;
                a = A[i];
                b = A[j];
                A[j] = A[n-1];//将最后一位的数字放入下标为j的位置(也就是空出来的那个位置,相当于空出来,)
                x = B[i];
                y = B[j];
                B[j] = B[n-1];//与上面同理

                A[i] = a + b;//第一个空间保存运算的结果
                B[i] = '(' + x + '+' + y + ')';//将第一步运算的表达式放在字符串数组中
                calculate4Times(n-1);

                //减法需要区分顺序
                A[i] = a - b;
                B[i] = '(' + x + '-' + y + ')';
                calculate4Times(n-1);
                A[i] = b - a;
                B[i] = '(' + y + '-' + x + ')';
                calculate4Times(n-1);

                //乘法
                A[i] = a * b;
                B[i] = '(' + x + '*' + y + ')';
                calculate4Times(n-1);

                //除法和减法一样需区分顺序这里要处理除数为0的情况,因为计算过程中可能出现除数为0的情况
                if(b!=0) {
                    A[i] = a / b;
                    B[i] = '(' + x + '/' + y + ')';
                    calculate4Times(n-1);
                }
                if(a!=0) {
                    A[i] = b / a;
                    B[i] = '(' + y + '/' + x + ')';
                    calculate4Times(n-1);
                }
                //当上面四则运算都不满足时
                //为了方便进入下一个for循环, 需要将之前的i和j上的值都重新找回
                A[i] = a;
                A[j] = b;
                B[i] = x;
                B[j] = y;
            }
        }
    }
        public static void getCard(Integer card1,Integer card2,Integer card3,Integer card4) {
        A[0] = card1;
        A[1] = card2;
        A[2] = card3;
        A[3] = card4;
        //将A,J,Q,K转换为对应的数字
        for(int i = 0;i < 4;i++) {
            if(A[i] == 1)
                B[i] = "A";
            else if(A[i] == 11)
                B[i] = "J";
            else if(A[i] == 12)
                B[i] = "Q";
            else if(A[i] == 13)
                B[i] = "K";
            else
                B[i] = String.valueOf(A[i]);
        }
        for(int i = 0;i < 4;i++) {
            System.out.println(B[i]);
        }
    }
    //穷举法,将每一种可能装入集合中
    public static void initFourPokerCards(){
        for(int i =1;i<=13;i++){
            for(int j = 1;j<13;j++)
            for(int k = 1;k<13;k++)
            for(int l = 1;l<13;l++) {
                PokerCardDTO pokerCardDTO = new PokerCardDTO();
                pokerCardDTO.setCard1(i);
                pokerCardDTO.setCard2(j);
                pokerCardDTO.setCard3(k);
                pokerCardDTO.setCard4(l);
                pokerCardsList.add(pokerCardDTO);
            }
        }

    }
    public static void main(String[] args) {
        initFourPokerCards();
        pokerCardsList.stream().forEach(x -> {
            getCard(x.getCard1(),x.getCard2(),x.getCard3(),x.getCard4());
            calculate4Times(n);       //调用函数求解
            System.out.println("共有"+simpleCount+"种解法");
        });

        System.out.println("通过穷举,总共有"+allCount+"种解法");
    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值