判断四张扑克牌能否凑成24点游戏算法

简介: 判断四张扑克牌能否凑成24点游戏算法

一道编程题大概意思是:有一副扑克牌,去掉大小王,还剩52张牌,J Q K代表11,12,13。现在随机抽取四张牌,每张牌必须得用到并且每张牌只能用一次,用+ - * / () 看能否实现最后结果可以等于24,例如:输入4 5 6 7 ,输出yes,输入 1 1 2 6 输出yes,输入 1 1 1 1,输出no

现在我的想法是:

1、随机抽取两个数

2、将这两个数进行+ - * / 运算,然后把这个数放到新的数组,将以前的去掉,现在数组就是3个数

3、将然后再回到1,进行递归运算,直到n=1

4、当n=1时,判断结果是否为24,是返回true,否返回false


另外:这样做用到了穷举法的思想,而且这样的算法省略了()的麻烦,应该还有另一种解决办法,就是用后缀表达式来完成,但是我本事不够,目前还没想到该如何实现,还请会的朋友们在下面留下你们的代码:


import java.util.Scanner;
/**
 * 
 * @author 二哈大叔
 *
 */
public class Poker24 {
    private static int COUNT = 4; //抽取的扑克牌数量
    private static double[] number = new double[COUNT]; //扑克牌的数组
    private static String[] expression = new String[COUNT]; //表达式数组
    public static boolean checkCondition(int n){
        //当递归到只有一个数时,判断是否满足条件
        if(n == 1){
            if(number[0] == 24){
                System.out.println(expression[0].substring(1, expression[0].length()-1));
                return true;
            }
            else
                return false;
        }
        for (int i = 0; i < n - 1; i++) {
            for(int j = i + 1; j < n; j++){
                double tempA = number[i];
                double tempB = number[j];
                String expreA = expression[i];
                String expreB = expression[j];
                number[j] = number[n-1];
                expression[j] = expression[n-1];
                //开始做加法
                expression[i] = "("+expreA+"+"+expreB+")";
                number[i] = tempA+tempB;
                if(checkCondition(n-1))
                    return true;
                //减法,两种情况,tempA-tempB和tempB-tempA
                expression[i] = "("+expreA+"-"+expreB+")";
                number[i] = tempA-tempB;
                if(checkCondition(n-1))
                    return true;
                expression[i] = "("+expreB+"-"+expreA+")";
                number[i] = tempB-tempA;
                if(checkCondition(n-1))
                    return true;
                //乘法
                expression[i] = "("+expreA+"*"+expreB+")";
                number[i] = tempA*tempB;
                if(checkCondition(n-1))
                    return true;
                //除法,两种情况,tempA/tempB和tempB/tempA,并且保证分母不为0
                if(tempB != 0){
                    expression[i] = "("+expreA+"/"+expreB+")";
                    number[i] = tempA/tempB;
                    if(checkCondition(n-1))
                        return true;
                }
                if(tempA != 0){
                    expression[i] = "("+expreB+"/"+expreA+")";
                    number[i] = tempB/tempA;
                    if(checkCondition(n-1))
                        return true;
                }
                number[i] = tempA;
                number[j] = tempB;
                expression[i] = expreA;
                expression[j] = expreB;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入1-13中"+COUNT+"个正整数");
        for (int i = 0; i < COUNT; i++) {
            number[i] = scanner.nextInt();
            int x;
            x = (int)number[i];
            expression[i] = String.valueOf(x);
        }
        if(checkCondition(COUNT))
            System.out.println("yes");
        else
            System.out.println("no");
    }
}
相关文章
|
7月前
|
机器学习/深度学习 人工智能 算法
当AI提示词遇见精密算法:TimeGuessr如何用数学魔法打造文化游戏新体验
TimeGuessr融合AI与历史文化,首创时间与空间双维度评分体系,结合分段惩罚、Haversine距离计算与加权算法,辅以连击、速度与完美奖励机制,实现公平且富挑战性的游戏体验。
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
228 1
|
人工智能 算法 Java
【搜索算法】数字游戏(C/C++)
【搜索算法】数字游戏(C/C++)
|
算法 数据挖掘 开发者
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
|
算法 JavaScript 前端开发
【经典算法】LCR187:破冰游戏(约瑟夫问题,Java/C/Python3/JavaScript实现含注释说明,Easy)
【经典算法】LCR187:破冰游戏(约瑟夫问题,Java/C/Python3/JavaScript实现含注释说明,Easy)
439 1
|
算法
互动游戏解决遇到问题之基于射线投射寻路算法的问题如何解决
互动游戏解决遇到问题之基于射线投射寻路算法的问题如何解决
197 0
|
存储 算法 PHP
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
176 1
开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里?
|
算法 JavaScript 前端开发
游戏物理系统 - 如何在JavaScript中实现基本的碰撞检测算法?
在JavaScript中实现2D矩形碰撞检测,常用AABB方法,适合简单游戏。创建Rectangle类,包含位置和尺寸属性,并定义`collidesWith`方法检查两矩形是否相交。通过比较边界位置判断碰撞,当四条边界条件均满足时,认定发生碰撞。基础算法适用于初级需求,复杂场景可采用更高级的碰撞检测库。
645 1
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
|
算法 机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人

热门文章

最新文章