Java撲克牌速算24的方法
已知一副撲克牌有54張,去除大王和小王,剩余52張。在其中隨機(jī)抽取4張牌,利用加減乘除進(jìn)行計(jì)算得到24. 從A到10,他們的值分別為1到10. 從J到K,他們對(duì)應(yīng)的值是減去10以后的值。編寫(xiě)程序生成一副撲克牌,隨機(jī)抽取4張,進(jìn)行計(jì)算是否能得到24. 如果可以,列出可能的計(jì)算表達(dá)式,可能有多種計(jì)算形式。
主要思想就是先生成除去大小王的52張撲克牌,然后從中隨機(jī)抽取四張。接著用排列組合的方式找到能計(jì)算得到24的表達(dá)式。
package Poker; import java.util.Random; import java.util.Stack; public class Poker { static int count = 0; static int count_2 = 0; public static Stack<Integer> stack = new Stack<Integer>(); public static Stack<Integer> stack_temp = new Stack<Integer>(); public static Stack<String> stack_collection = new Stack<String>(); public static void main(String[] args) { System.out.println("Poker World"); // 生成撲克牌 int poker[][] = new int[4][13]; for(int i = 0; i < 4; i++) { for(int j = 0; j < 13; j++) { if(j + 1 < 11) { poker[i][j] = j+1; } else { poker[i][j] = j-9; } } } Random r = new Random(); int randomPoker[] = new int[4]; for(int i = 0; i < 4; i++) { randomPoker[i] = poker[r.nextInt(3)][r.nextInt(12)]; stack_temp.add(randomPoker[i]); } System.out.print("抽到的撲克牌:"); for(int element: randomPoker) { System.out.printf("%d ", element); } System.out.print("\n"); order(randomPoker, 4, 0); //System.out.printf("%d\n",count_2); if(count != 0) { System.out.printf("共有%d種計(jì)算方法", count); } else { System.out.print("無(wú)法計(jì)算得到24"); } } private static void order(int[] poker, int targ, int cur) { // TODO Auto-generated method stub if(cur == targ) { String str = stack.toString(); if(!stack_collection.contains(str)) { stack_collection.add(str); count_2 += 1; int new_poker[] = new int[4]; for(int i = 0; i < 4; i++) { new_poker[i] = stack.pop(); } for(int i = 3; i >= 0; i--) { stack.push(new_poker[i]); } do24(new_poker); } return; } for(int i = 0; i < poker.length; i++) { if(stack_temp.contains(poker[i])) { stack.add(poker[i]); for(int j = 0; j < stack_temp.size(); j++) { if(stack_temp.get(j) == poker[i]) { stack_temp.remove(j); break; } } order(poker, targ, cur+1); stack.pop(); stack_temp.add(poker[i]); } } } public static void do24(int[] poker){ // 四個(gè)數(shù)字中間有三個(gè)運(yùn)算符,因此用三重循環(huán)遍歷。其中0表示+,1表示-,2表示x,3表示÷ int test[] = {1,2,3,4}; for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ for(int k=0;k<4;k++){ operate(poker,i,j,k); //operate(test,i,j,k); } } } } /* * 分類(lèi)討論 */ public static void operate(int[] poker, int op1, int op2, int op3) { int num1 = poker[0]; int num2 = poker[1]; int num3 = poker[2]; int num4 = poker[3]; if((cal(cal(cal(num1,num2,op1),num3,op2),num4,op3) == 24)) { if((((op2 == 0) || (op2 == 1))&&((op3 == 0) || (op3 == 1)))||((op2 != 0) && (op2 != 1))) { System.out.println("("+num1+symbol(op1)+num2+")"+symbol(op2)+num3+symbol(op3)+num4); count++; } } else if(cal(cal(num1,cal(num2,num3,op2),op1),num4,op3) == 24) { if((((op1 == 0) || (op1 == 1))&&((op3 == 0) || (op3 == 1)))||((op1 != 0) && (op1 != 1))) { System.out.println(num1+symbol(op1)+"("+num2+symbol(op2)+num3+")"+symbol(op3)+num4); count++; } else { System.out.println("["+num1+symbol(op1)+"("+num2+symbol(op2)+num3+")]"+symbol(op3)+num4); count++; } } else if(cal(cal(num1,num2,op1),cal(num3,num4,op3),op2) == 24) { if((((op1 == 0) || (op1 == 1))&&((op2 == 0) || (op2 == 1)))||((op1 != 0) && (op1 != 1))) { System.out.println(num1+symbol(op1)+num2+symbol(op2)+"("+num3+symbol(op3)+num4+")"); count++; } else { System.out.println("("+num1+symbol(op1)+num2+")"+symbol(op2)+"("+num3+symbol(op3)+num4+")"); count++; } } else if(cal(cal(cal(num1,num2,op1),num3,op2),num4,op3) == 24) { if((((op1 == 0) || (op1 == 1))&&((op2 == 0) || (op2 == 1)))||((op1 != 0) && (op1 != 1))) { System.out.println("("+num1+symbol(op1)+num2+symbol(op2)+num3+")"+symbol(op3)+num4); count++; } else { System.out.println("[("+num1+symbol(op1)+num2+")"+symbol(op2)+num3+"]"+symbol(op3)+num4); count++; } } else if(cal(num1,cal(cal(num2,num3,op2),num4,op3),op1) == 24) { if((((op2 == 0) || (op2 == 1))&&((op3 == 0) || (op3 == 1)))||((op2 != 0) && (op2 != 1))) { System.out.println(num1+symbol(op1)+"("+num2+symbol(op2)+num3+symbol(op3)+num4+")"); count++; } else { System.out.println(num1+symbol(op1)+"[("+num2+symbol(op2)+num3+")"+symbol(op3)+num4+"]"); count++; } } else if(cal(num1,cal(num2,cal(num3,num4,op3),op2),op1) == 24) { System.out.println(num1+symbol(op1)+"["+num2+symbol(op2)+"("+num3+symbol(op3)+num4+")]"); count++; } } /* * 按順序計(jì)算 */ public static double cal(double num1,double num2,int num){ double sum=0.0; switch(num) { case 0: sum = num1 + num2; break; case 1: sum = num1 - num2; break; case 2: sum = num1 * num2; break; case 3: if(num1 % num2 == 0) { sum = num1 / num2; } else { sum = 999; } break; default: break; } return sum; } /* * 將代表計(jì)算符號(hào)的數(shù)字轉(zhuǎn)換成字符存入String數(shù)組并返回 */ public static String symbol(int symbolNum){ String symbol = ""; switch (symbolNum) { case 0: symbol="+"; break; case 1: symbol="-"; break; case 2: symbol="x"; break; case 3: symbol="÷"; break; default: break; } return symbol; } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java實(shí)現(xiàn)簡(jiǎn)易撲克牌游戲的完整實(shí)例
- java實(shí)現(xiàn)撲克牌牌面小程序
- java實(shí)現(xiàn)簡(jiǎn)單撲克牌游戲
- java實(shí)現(xiàn)撲克牌分發(fā)功能
- java實(shí)現(xiàn)撲克牌發(fā)牌器
- java實(shí)現(xiàn)簡(jiǎn)易撲克牌游戲
- 使用java對(duì)一副撲克牌建模
- Java實(shí)現(xiàn)撲克牌洗牌和發(fā)牌
- java用撲克牌計(jì)算24點(diǎn)
- Java基礎(chǔ)高級(jí)綜合練習(xí)題撲克牌的創(chuàng)建
- Java模擬撲克牌洗牌實(shí)現(xiàn)生成52張撲克的方法示例
- JAVA collection集合之撲克牌游戲?qū)嵗?/a>
- Java實(shí)戰(zhàn)練習(xí)之撲克牌魔術(shù)
相關(guān)文章
使用IDEA創(chuàng)建servlet?JavaWeb?應(yīng)用及使用Tomcat本地部署的實(shí)現(xiàn)
本文主要介紹了使用IDEA創(chuàng)建servlet?JavaWeb?應(yīng)用及使用Tomcat本地部署2022-01-01Spring Boot Logging Level設(shè)置為off時(shí)的Bug
這篇文章主要介紹了Spring Boot Logging Level設(shè)置為off時(shí)的Bug,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn)
這篇文章主要介紹了復(fù)雜JSON字符串轉(zhuǎn)換為Java嵌套對(duì)象的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09JAVA 文件監(jiān)控 WatchService的示例方法
本篇文章主要介紹了JAVA 文件監(jiān)控 WatchService的示例方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10springboot+redis實(shí)現(xiàn)簡(jiǎn)單的熱搜功能
這篇文章主要介紹了springboot+redis實(shí)現(xiàn)一個(gè)簡(jiǎn)單的熱搜功能,通過(guò)代碼介紹了過(guò)濾不雅文字的過(guò)濾器,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05徹底搞懂java并發(fā)ThreadPoolExecutor使用
這篇文章主要為大家介紹了徹底搞懂java并發(fā)ThreadPoolExecutor使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02JavaWeb實(shí)現(xiàn)裁剪圖片上傳完整代碼
這篇文章主要為大家詳細(xì)介紹了javaWeb實(shí)現(xiàn)裁剪圖片上傳完整代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09