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;
 }
}

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

(0)

相关推荐

  • Java模拟扑克牌洗牌实现生成52张扑克的方法示例

    本文实例讲述了Java模拟扑克牌洗牌实现生成52张扑克的方法.分享给大家供大家参考,具体如下: 要求: 生成52张扑克,模拟扑克牌洗牌,并输出. 实现代码: package com.NCU.ZHANGhuirong; import java.util.ArrayList; import java.util.Collections; public class Card { public String poker(int num) { String str = ""; String[] f

  • JAVA collection集合之扑克牌游戏实例

    Collection 层次结构中的根接口.Collection表示一组对象,这些对象也称为collection的元素.一些 collection 允许有重复的元素,而另一些则不允许.一些 collection 是有序的,而另一些则是无序的.JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现.此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection. 主要内容:这里使用collection集合,模拟香港电影中大佬们玩的

  • Java扑克牌速算24的方法

    已知一副扑克牌有54张,去除大王和小王,剩余52张.在其中随机抽取4张牌,利用加减乘除进行计算得到24. 从A到10,他们的值分别为1到10. 从J到K,他们对应的值是减去10以后的值.编写程序生成一副扑克牌,随机抽取4张,进行计算是否能得到24. 如果可以,列出可能的计算表达式,可能有多种计算形式. 主要思想就是先生成除去大小王的52张扑克牌,然后从中随机抽取四张.接着用排列组合的方式找到能计算得到24的表达式. package Poker; import java.util.Random;

  • Java杂谈之代码重构的方法多长才算长

    目录 多长算"长"? 长函数的产生 以性能为由 平铺直叙 一次加一点 总结 每当看到长函数,我们都得: 被迫理解一个长函数 在一个长函数中,小心翼翼地找出需要的逻辑,按需求微调 几乎所有程序员都会有类似经历. 没人喜欢长函数,但你却要一直和各种长函数打交道. 几百上千行的函数肯定是不足以称霸的. 多长算"长"? 100 行?对于函数长度容忍度太高了!这是导致长函数产生的关键点. 看具体代码时,一定要能够看到细微之处.关键点就是将任务拆解得越小越好,这个观点对代码同样

  • java 多线程饥饿现象的问题解决方法

    java 多线程饥饿现象的问题解决方法 当有线程正在读的时候,不允许写 线程写,但是允许其他的读线程进行读.有写线程正在写的时候,其他的线程不应该读写.为了防止写线程出现饥饿现象,当线程正在读,如果写线程请求写,那么应该禁止再来的读线程进行读. 实现代码如下: File.Java package readerWriter; public class File { private String name; public File(String name) { this.name=name; } }

  • java交换排序之鸡尾酒排序实现方法

    本文实例讲述了java交换排序之鸡尾酒排序实现方法.分享给大家供大家参考.具体如下: 鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序 (也可以视作选择排序的一种变形), 涟漪排序, 来回排序 or 快乐小时排序, 是冒泡排序的一种变形.此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序. 与冒泡排序不同的地方: 鸡尾酒排序等于是冒泡排序的轻微变形.不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素.他可以得到比冒泡排序稍微好一点的效能,原因是冒

  • Java的基本数据类型和运算方法(必看篇)

    编码 ASCII--0~127 65-A 97-a 西欧码表---ISO-8859-1---0-255---1个字节 gb2312----0-65535---gbk---2个字节 Unicode编码体系---utf-8---3个字节 中 f bit位 Byte字节 1Byte = 8bit 1KB=1024B MB GB TB PB---计算机中存储单位 常量 整数常量---所有的整数 3,99,107 小数常量---所有的小数 3.5 100.9 字符常量---用单引号将一个字母.数字.符号标

  • Java集合Iterator迭代的实现方法

    我们常常使用 JDK 提供的迭代接口进行 Java 集合的迭代. Iterator iterator = list.iterator(); while(iterator.hasNext()){ String string = iterator.next(); //do something } 迭代其实我们可以简单地理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类,它是一个很典型的设计模式.Iterator 模式是用于遍历集合类的标准访问方法.它可以把访问逻辑从不同类型的集合类中抽象出来

  • Java 关键字 速查表介绍

    访问控制: private 私有的 protected 受保护的 public 公共的 类.方法和变量修饰符 abstract 声明抽象 class 类 extends 扩允,继承 final 终极,不可改变的 implements实现 interface 接口 native 本地 new 新,创建 static 静态 strictfp 严格,精准 synchronized 线程,同步 transient 短暂 volatile 易失 程序控制语句 break 跳出循环 continue 继续

  • java交换排序之奇偶排序实现方法

    本文实例讲述了java交换排序之奇偶排序实现方法.分享给大家供大家参考.具体如下: 奇偶排序,或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算.这是与冒泡排序特点类似的一种比较排序. 该算法中,通过比较数组中相邻的(奇-偶)位置数字对,如果该奇偶对是错误的顺序(第一个大于第二个),则交换.下一步重复该操作,但针对所有的(偶-奇)位置数字对.如此交替进行下去. 处理器数组的排序 在并行计算排序中,每个处理器对应处理一个值,并仅有与左右邻居的本地互连.所有处理器可

  • Java程序实现导出Excel的方法(支持IE低版本)

    今天想整理一下自己前段时间遇到的一个导出的问题. 因为项目的需求,要做一部分导出功能.开始的时候用的公司的导出,但是很奇怪有部分模块导出的时候就是会报500错误,发现在删减一些字段后就恢复了正常,当时因为项目紧张,也就临时删减了一些,但也不是长久之计,之后自己在原本的基础上重新修改整理了一下,目前运行还算稳定,就此和大家分享一下. 导出需要三个部分,js,公共方法,后台方法. js代码 function exportData() { //前台接收的参数 rwmc = $("#txt_rwmc&q

  • java对数组进行排序的方法

    本文实例讲述了java对数组进行排序的方法.分享给大家供大家参考.具体如下: public class Test1 { public static void showArray(int[] array) { for (int n = 0; n < array.length; n++) { System.out.print(array[n]); System.out.print(" "); } System.out.println(); } public static int[]

随机推荐