判斷四張撲克牌能否湊成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");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章