标签:
给玩家4张牌,每张牌的面值在1-13之间,允许其中有数值相同的牌,采用加、减、乘、除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能用一次。构造表达式,使其结果为24。
输入: n1, n2, n3, n4 (1~13)
输出: 若能得到运算结果为 24, 则输出一个对应的运算表达式
如:
输入: 11, 8, 3, 5
输出: (11-8) * (3*5) = 24
代码如下:
1 package chapter1youxizhilePointsGame; 2 3 import java.util.Scanner; 4 5 /** 6 * 点游戏(24点) 7 * 【解法一】穷举法 8 * @author DELL 9 * 10 */ 11 public class PointsGame1 { 12 public static final double Precision = 1E-6; //精度 13 public static final int CardsNumber = 4; //牌的数量 14 public static final int ResultValue = 24; //要求的运算结果值 15 private double[] number; //所有可能的四则运算所得到的值,初始为牌的值 16 private String[] result; //存放要输出的四则运算结果字符串 17 //构造函数对数组进行初始化 18 public PointsGame1(){ 19 number = new double[CardsNumber]; 20 result = new String[CardsNumber]; 21 Scanner input = new Scanner(System.in); 22 System.out.print("请输入"+CardsNumber+"张牌的值(以空格分隔):"); 23 for(int i=0;i<CardsNumber;i++){ 24 number[i] = input.nextInt(); 25 result[i] = Double.toString(number[i]); 26 } 27 28 } 29 /** 30 * 穷举计算的函数 31 * @param n 四则运算结果的数量,初始为牌的数量 32 * @return 是否可以找到对应的运算表达式 33 */ 34 public boolean pointsGame(int n){ 35 if(n==1){ 36 if(Math.abs(number[0]-ResultValue)<=Precision){ 37 System.out.println("满足条件的运算表达式为:"+result[0]); 38 return true; 39 }else{ 40 return false; 41 } 42 } 43 for(int i=0;i<n;i++){ 44 for(int j=i+1;j<n;j++){ 45 double a,b; //当前取出的两个数 46 String expa,expb; //当前存储的四则运算字符串 47 a = number[i]; 48 b = number[j]; 49 number[j] = number[n-1]; 50 51 expa = result[i]; 52 expb = result[j]; 53 result[j] = result[n-1]; 54 //加法运算 55 number[i] = a + b; 56 result[i] = "("+expa+"+"+expb+")"; 57 if(pointsGame(n-1)) 58 return true; 59 //减法运算 60 number[i] = a - b; 61 result[i] = "("+expa+"-"+expb+")"; 62 if(pointsGame(n-1)) 63 return true; 64 65 number[i] = b - a; 66 result[i] = "("+expb+"-"+expa+")"; 67 if(pointsGame(n-1)) 68 return true; 69 //乘法运算 70 number[i] = a * b; 71 result[i] = "("+expa+"*"+expb+")"; 72 if(pointsGame(n-1)) 73 return true; 74 //除法运算 75 if(b!=0){ 76 number[i] = a / b; 77 result[i] = "("+expa+"/"+expb+")"; 78 if(pointsGame(n-1)) 79 return true; 80 } 81 82 if(a!=0){ 83 number[i] = b / a; 84 result[i] = "("+expb+"/"+expa+")"; 85 if(pointsGame(n-1)) 86 return true; 87 } 88 //如果还没找到,就恢复原来的状态继续下一轮搜索 89 number[i] = a; 90 number[j] = b; 91 result[i] = expa; 92 result[j] = expb; 93 } 94 } 95 return false; 96 } 97 98 public static void main(String[] args) { 99 PointsGame1 pg = new PointsGame1(); 100 if(pg.pointsGame(CardsNumber)){ 101 System.out.println("构造成功!"); 102 }else 103 System.out.println("构造失败!"); 104 } 105 106 }
程序运行结果如下:
请输入4张牌的值(以空格分隔):11 8 3 5 满足条件的运算表达式为:(((11.0-8.0)+5.0)*3.0) 构造成功!
标签:
原文地址:http://www.cnblogs.com/gaopeng527/p/4613624.html