Java扑克牌速算24的方法

 更新时间:2020年03月06日 10:35:53   作者:RodrickOMG  
这篇文章主要为大家详细介绍了Java扑克牌速算24的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

已知一副扑克牌有54张,去除大王和小王,剩余52张。在其中随机抽取4张牌,利用加减乘除进行计算得到24. 从A到10,他们的值分别为1到10. 从J到K,他们对应的值是减去10以后的值。编写程序生成一副扑克牌,随机抽取4张,进行计算是否能得到24. 如果可以,列出可能的计算表达式,可能有多种计算形式。

主要思想就是先生成除去大小王的52张扑克牌,然后从中随机抽取四张。接着用排列组合的方式找到能计算得到24的表达式。

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种计算方法", count);
 }
 else {
  System.out.print("无法计算得到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){
 // 四个数字中间有三个运算符,因此用三重循环遍历。其中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);
  }
  }
 }
 
 
 }
 /*
 * 分类讨论
 */
 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++;
 }
 }
 /*
 * 按顺序计算
 */
 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;
 }
 /*
 * 将代表计算符号的数字转换成字符存入String数组并返回
 */
 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;
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java生成sm2/hutool生成公钥私钥代码示例

    java生成sm2/hutool生成公钥私钥代码示例

    这篇文章主要给大家介绍了关于java生成sm2/hutool生成公钥私钥的相关资料,Java是一种广泛使用的编程语言,可以用来生成公钥和私钥文件,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • 使用IDEA创建servlet JavaWeb 应用及使用Tomcat本地部署的实现

    使用IDEA创建servlet JavaWeb 应用及使用Tomcat本地部署的实现

    本文主要介绍了使用IDEA创建servlet JavaWeb 应用及使用Tomcat本地部署
    2022-01-01
  • Spring Boot Logging Level设置为off时的Bug

    Spring Boot Logging Level设置为off时的Bug

    这篇文章主要介绍了Spring Boot Logging Level设置为off时的Bug,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 复杂JSON字符串转换为Java嵌套对象的实现

    复杂JSON字符串转换为Java嵌套对象的实现

    这篇文章主要介绍了复杂JSON字符串转换为Java嵌套对象的实现,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • JAVA 文件监控 WatchService的示例方法

    JAVA 文件监控 WatchService的示例方法

    本篇文章主要介绍了JAVA 文件监控 WatchService的示例方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • springboot之联表查询方式

    springboot之联表查询方式

    这篇文章主要介绍了springboot之联表查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • springboot+redis实现简单的热搜功能

    springboot+redis实现简单的热搜功能

    这篇文章主要介绍了springboot+redis实现一个简单的热搜功能,通过代码介绍了过滤不雅文字的过滤器,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • SpringBoot整合Swagger的方法示例

    SpringBoot整合Swagger的方法示例

    这篇文章主要介绍了SpringBoot整合Swagger的方法示例,详细介绍了SpringBoot如何整合Swagger以及swagger注解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 彻底搞懂java并发ThreadPoolExecutor使用

    彻底搞懂java并发ThreadPoolExecutor使用

    这篇文章主要为大家介绍了彻底搞懂java并发ThreadPoolExecutor使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • JavaWeb实现裁剪图片上传完整代码

    JavaWeb实现裁剪图片上传完整代码

    这篇文章主要为大家详细介绍了javaWeb实现裁剪图片上传完整代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09

最新评论