游戏规则:随机每次从扑克牌中抽取四张牌,使用加减乘除,第一个得到24的人赢,其中AJQK分别代表1,11,12,13.
算法分析:先定义得到有多少种算法的方法getCount(),定义产生随机数的方法createRandomWords(),显示纸牌号码 的方法showWords()将产生的随机数转化为list列表在遍历输出,定义将字符转换为double类型的方法 convertStringToDouble(),主要将AJQK转换为数字类型,最后定义回溯算法exhaustiveMethodToCards()求 得得到24的全部解
package com.jack.game;
import java.util.List;
import java.util.Random;
public class TFPGame {
private final int cycleNum = 4;//抽取四张牌
private final String[] OriginalCards = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
private String[] randomCards = new String[cycleNum];
private double[] number = new double[cycleNum];
private boolean flag = false;
private int count = 0;//计算方法的个数
public int getCount(){ //得到有多少种算法
return count;
}
public void createRandomWords(){ //定义产生随机数的方法
Random random = new Random(); //创建对象
for( int i = 0 ; i < cycleNum ; i++){
randomCards[i] = OriginalCards[random.nextInt(OriginalCards.length)];//返回一个0到OriginalCards.length长度的随机整数,并存入数组。
}
}
public void showWords() { //定义显示纸牌号码的方法
System.out.println("随机产生的纸牌:");
List<String> stringList = java.util.Arrays.asList( randomCards );//将产生的随机数数组转化为list列表
for( Object str : stringList) //遍历Stringlist
{
System.out.print(str + " ");
}
System.out.println();
}
public void convertStringToDouble() //定义方法,主要是将A,J,Q,K转化为double类型
{
for( int i = 0 ; i < cycleNum ; i++)
{
switch( randomCards[i] )
{
case "A" :
randomCards[i] = "1";
break;
case "J" :
randomCards[i] = "11";
break;
case "Q" :
randomCards[i] = "12";
break;
case "K" :
randomCards[i] = "13";
break;
}
number[i] = Double.parseDouble(randomCards[i]);
}
}
public void exhaustiveMethodToCards( int n ){ //回溯算法求运算得24的所有解
if ( n == 1 ) {
if ( Math.abs ( number[0] - 24 ) <= ( 1e-6 ) ){ //如果number【0】-24的绝对值小于10的-6次方
System.out.println( randomCards[0]);
count++;
flag = true;
}
}
else{
for(int i=0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
double a, b;
String expressiona, expressionb;
a = number[i];
b = number[j];
number[j] = number[n - 1];
expressiona = randomCards[i];
expressionb = randomCards[j];
randomCards[j] = randomCards[n - 1];
randomCards[i]= '('+ expressiona + '+' + expressionb + ')';
number[i] = a + b;
exhaustiveMethodToCards(n-1); //将n-1带入方法继续执行
randomCards[i]='('+ expressiona+ '-' + expressionb + ')';
number[i] = a - b;
exhaustiveMethodToCards(n-1); //将n-1带入方法继续执行
randomCards[i] = '('+expressionb + '-' + expressiona + ')';
number[i] = b -a;
exhaustiveMethodToCards(n-1); //将n-1带入方法继续执行
randomCards[i]= '('+ expressiona +'*'+ expressionb+ ')';
number[i]=a*b;
exhaustiveMethodToCards(n-1); //将n-1带入方法继续执行
if (b != 0) //若b不为0,可为除数
{
randomCards[i] ='('+expressiona+'/' + expressionb + ')';
number[i] = a / b;
exhaustiveMethodToCards(n-1); //将n-1带入方法继续执行
}
if (a != 0) //若a不为0,可为除数
{
randomCards[i]='('+expressionb + '/'+ expressiona + ')';
number[i] = b / a;
exhaustiveMethodToCards(n-1); //将n-1带入方法继续执行
}
number[i] =a;
number[j]=b;
randomCards[i] = expressiona;
randomCards[j] = expressionb;
}
}
}
}
public static void main(String[] args) {
TFPGame tfp = new TFPGame(); //创建TFPGame的对象tfp
tfp.createRandomWords();
tfp.showWords();
tfp.convertStringToDouble(); //调用方法
System.out.println("\n计算结果如下:");
tfp.exhaustiveMethodToCards(tfp.cycleNum);
if ( tfp.flag == true )
{
System.out.println("\n总共有" + tfp.getCount() + "种算法");
}
else
{
System.out.println("\n失败!");
}
}
}