Java扑克牌速算24的方法
作者:RodrickOMG 发布时间:2022-10-13 22:17:18
标签:java,扑克牌,速算
已知一副扑克牌有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;
}
}
来源:https://blog.csdn.net/daiyucheng88/article/details/104552723


猜你喜欢
- 本文实例讲述了Java实现的模糊匹配某文件夹下的文件并删除功能。分享给大家供大家参考,具体如下:package com.wyebd.gis;
- 本文展示了C#实现获取一年中是第几个星期的方法,对初学者学习C#时间操作有一定的借鉴价值,具体实现代码如下:主要功能代码如下:/// <
- 最近有个同事在调用一个类库中的方法时遇到了一个问题,异常信息如下:尝试释放正在使用的RCW,活动线程或其他线程上正在使用该 RCW,释放正在
- 前言值类型和引用类型,是c#比较基础,也必须掌握的知识点,但是也不是那么轻易就能掌握,今天跟着老胡一起来看看吧。 典型类型首先我们
- 背景:由于所在办公室网络限制,笔者每天都使用网络都要先连接无线网。如下图,输入授权用户信息登录后才能使用WIFI。丧心病狂的是该网页Cook
- 日期格式化标准 DateTime 格式字符串如果格式字符串只包含下表列出的某个单个格式说明符,则它们被解释为标准格式说明符。如果指定的格式字
- 摘要在使用java做后台站点的开发张,图表和报表功能都是不可或缺 的。本文推荐了8款最精彩实用的Java图表应用,大部分图表应用的功能都类似
- 既然是一个网关。那么全局过滤器肯定是少不了的一个存在。像是鉴权、认证啥的不可能每个服务都做一次,一般都是在网关处就搞定了。Zuul他就有很强
- 前言👉本文中所有的代码和运行结果都是在amazon corretto openjdk 1.8环境中的,如果你不是使用该环境,可能会略有偏差。
- 本博文将为您提供自Java 7以来增加的很棒的新功能的示例。我将展示每个Java版本的至少一项重大改进,一直到2020年秋季发布的Java
- 今天和大家聊一聊Android中关于FontMetrics的几个属性的理解,在Android中用画笔绘制文字时,文字最终的大小是和绘制文字的
- package com.cjonline.foundation.evisa;import java.io.BufferedReader;im
- 在SpringAMQP的发送方法中,接收消息的类型是Object,也就是说我们可以发送任意对象类型的消息,SpringAMQP会帮我们序列化
- 目录一、Lambda 表达式简介1、什么是 Lambda 表达式2、为什么需要 Lambda 表达式二、函数式接口和定义1、什么是函数式接口
- 目录1、前言2、实例1、前言法存取数据。除此之外,还可以控制数据的存取方式。在面向对象编程中,大多数都是以类作为数据封装的基本单位。类将数据
- Android 自定义返回按钮的实例详解程序中我们有时候想让放回按钮按照自己的需求调整页面而不是单纯的按照系统返回上一级,这个问题很简单,重
- 在android编码中,会有一些简便的写法和编码习惯,会导致我们的代码有很多内存泄露的问题,在这里做一个已知错误的总结:1、编写单例的时候常
- 本文实例讲述了Android编程基于重力传感器实现横竖屏放向切换功能。分享给大家供大家参考,具体如下:最近项目中用到了vr视频播放,因为自己
- 在java中的整数类型有四种,分别是 byte short int long 其中byte只有一个字节 0或1,在此不详细讲解。
- 前言本文章主要讲解控制流程:块作用域、条件语句、switch语句,篇幅不大,通俗易记。块作用域在深入学习控制结构前,须先了解块的作用。定义: