24点游戏问题(java)
随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式。
import java.util.Random;
/**
* @ClassName: _24game
* @Description: 解法:假设4 个数的集合A={1,2,3,4},
* 先取前两个数进行不同的四则运算,1+2=3,1-2=-1,2-1=1,1/2=0.5,2/1=2,1x2=2,
* 将所得的结果递归的与集合A中剩下的进行四则运算,
* 问题规模从4个变成3个。。。最后变成2个。
* @author Administrator
* @date 2018年9月29日
*/
public class _24game{
static int num=0;//计算总共有多少种情况
public static void main(String[] args) {
/*
* 定义一个数组,用来存放4张牌(4个从1到13的随机数)
* 并将它们存入数组poker
*/
int [] cards = new int [4];
Random random = new Random();
cards[0] = random.nextInt(13)+1;
cards[1] = random.nextInt(13)+1;
cards[2] = random.nextInt(13)+1;
cards[3] = random.nextInt(13)+1;
System.out.println(cards[0]+"\n"+cards[1]+"\n"+cards[2]+"\n"+cards[2]);
int[] poker=new int[]{cards[0],cards[1],cards[2],cards[3]};
opertor(poker);
if(num==0){
System.out.println("以上四个数不能通过四则运算得到24");
}else{
System.out.println("总共有"+num+"种情况");
}
}
/*
* 使用3层for循环来获取运算符的所有组合存入signNum数组
* 调用sign1方法获得与数字对应的运算符输出
*/
public static void opertor(int[] poker){
double sum=0;
for(int i=0;i<4;i++){
double sum1=count(poker[0],poker[1],i);
for(int j=0;j<4;j++){
double sum2=count(sum1,poker[2],j);
for(int k=0;k<4;k++){
sum=count(sum2,poker[3],k);
int[] signNum={i,j,k};
String[] sign1=new String[4];
sign1=sign(signNum);
if(sum==24){
num++;
System.out.println("["+"("+poker[0]+" "+sign1[0]+" "+poker[1]+")"+" "+sign1[1]+" "+poker[2]+"]"+" "+sign1[2]+" "+poker[3]);
}
}
}
}
}
/*
* 通过符号来计算两个数并返回
*/
public static double count(double num1,double num2,int num){
double sum=0.0;
if(num==0){
sum=num1+num2;
}else if(num==1){
sum=num1-num2;
}else if(num==2){
sum=num1*num2;
}else{
sum=num1/num2;
}
return sum;//返回运算后的值
}
/*
* 将代表计算符号的数字转换成字符存入String数组并返回
*/
public static String[] sign(int[] signNum){
String[] sign1=new String[4];
for(int i=0;i<3;i++){
int sign2=signNum[i];
switch (sign2) {
case 0:
sign1[i]="+";
break;
case 1:
sign1[i]="-";
break;
case 2:
sign1[i]="x";
break;
case 3:
sign1[i]="÷";
break;
default:
break;
}
}
return sign1;//返回运算符
}
}