作业说明:
题目:从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
思路:首先将4个扑克牌代表的数字存储起来,然后挑选出两个数字进行”±*%”运算,将得到的数存储起来与第三个数运算,重复以上过程,直到只剩一个数,判断得到的结果是否为24,是的话输出表达式。
先对随机产生的两个数进行运算,这两个数计算的结果和第三个数组成两数计算,
以此类推,直到四个数经过运算组合成一个数(即n = 1)时,判断这个数是否等于24
若等于24,输出这四个数的运算,否则返回false。
当递归到只有一个数时,判断是否满足等于24的条件。
输出可以构成24的表达式。
在方法中,定义两个变量两个表达式,来进行运算,将运算结果存储到第一个变量和表达式。
加法乘法不分顺序,减法需要考虑,num1-num2/num2-num1。除法:(1)num1/num2.(2)num2/num1。 并且分母不能为零。
package homework1;
import java.util.Scanner;
public class Game24 {
private static int NUM = 4; //抽取的扑克牌数量
private static double[] number = new double[NUM]; //定义扑克牌的数组
private static String[] express = new String[NUM]; //定义表达式数组
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); //从键盘输入
System.out.println("请输入1-13之间的4个正整数");
for (int i = 0; i < NUM; i++) { //连续输入1-13之间的4个数
number[i] = scanner.nextInt();
int x = (int)number[i];
express[i] = String.valueOf(x);
}
if(compute(NUM))
System.out.println("可以组成24!");
else
System.out.println("不能组成24!");
}
/**
* 先对随机产生的两个数进行运算,这两个数计算的结果和第三个数组成两数计算,
* 以此类推,直到四个数经过运算组合成一个数(即n = 1)时,判断这个数是否等于24
* 若等于24,输出这四个数的运算,否则返回false
* @param n
* @return
*/
public static boolean compute(int n){
//当递归到只有一个数时,判断是否满足等于24的条件
if(n == 1){
if(number[0] == 24){
/*
* 输出可以构成24的表达式
* substring(x) 是从字符串的的第x个字符截取
* substring(x,y)是从x到y前的位置停止
*/
System.out.println(express[0]);
return true;
}
else
return false;
}
for (int i = 0; i < n - 1; i++) {
for(int j = i + 1; j < n; j++){
//首先对两个数进行运算,定义两个变量,和两个表达式
double num1 = number[i];
double num2 = number[j];
//两个表达式
String express1 = express[i];
String express2 = express[j];
number[j] = number[n-1];
express[j] = express[n-1];
//做加法运算
express[i] = "("+express1+"+"+express2+")";
number[i] = num1+num2;
if(compute(n-1))
return true;
/*减法运算:
* (1)num1-num2
* (2)num2-num1
*/
express[i] = "("+express1+"-"+express2+")";
number[i] = num1-num2;
if(compute(n-1))
return true;
express[i] = "("+express2+"-"+express1+")";
number[i] = num2-num1;
if(compute(n-1))
return true;
//乘法运算
express[i] = "("+express1+"*"+express2+")";
number[i] = num1*num2;
if(compute(n-1))
return true;
/*除法运算两种情况(分母不为0)
* (1)num1/num2
* (2)num2/num1
*/
//第一种
if(num2 != 0){//分母不为0
express[i] = "("+express1+"/"+express2+")";
number[i] = num1/num2;
if(compute(n-1))
return true;
}
//第二种
if(num1 != 0){//分母不为0
express[i] = "("+express2+"/"+express1+")";
number[i] = num2/num1;
if(compute(n-1))
return true;
}
number[i] = num1;
number[j] = num2;
express[i] = express1;
express[j] = express2;
}
}
return false;
}
}