第1章 游戏之乐——点游戏
2015-07-01 20:10
411 查看
点游戏
1. 问题描述:
给玩家4张牌,每张牌的面值在1-13之间,允许其中有数值相同的牌,采用加、减、乘、除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能用一次。构造表达式,使其结果为24。输入: n1, n2, n3, n4 (1~13)
输出: 若能得到运算结果为 24, 则输出一个对应的运算表达式
如:
输入: 11, 8, 3, 5
输出: (11-8) * (3*5) = 24
2. 【解法一】穷举法
代码如下:package chapter1youxizhilePointsGame; import java.util.Scanner; /** * 点游戏(24点) * 【解法一】穷举法 * @author DELL * */ public class PointsGame1 { public static final double Precision = 1E-6; //精度 public static final int CardsNumber = 4; //牌的数量 public static final int ResultValue = 24; //要求的运算结果值 private double[] number; //所有可能的四则运算所得到的值,初始为牌的值 private String[] result; //存放要输出的四则运算结果字符串 //构造函数对数组进行初始化 public PointsGame1(){ number = new double[CardsNumber]; result = new String[CardsNumber]; Scanner input = new Scanner(System.in); System.out.print("请输入"+CardsNumber+"张牌的值(以空格分隔):"); for(int i=0;i<CardsNumber;i++){ number[i] = input.nextInt(); result[i] = Double.toString(number[i]); } } /** * 穷举计算的函数 * @param n 四则运算结果的数量,初始为牌的数量 * @return 是否可以找到对应的运算表达式 */ public boolean pointsGame(int n){ if(n==1){ if(Math.abs(number[0]-ResultValue)<=Precision){ System.out.println("满足条件的运算表达式为:"+result[0]); return true; }else{ return false; } } for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ double a,b; //当前取出的两个数 String expa,expb; //当前存储的四则运算字符串 a = number[i]; b = number[j]; number[j] = number[n-1]; expa = result[i]; expb = result[j]; result[j] = result[n-1]; //加法运算 number[i] = a + b; result[i] = "("+expa+"+"+expb+")"; if(pointsGame(n-1)) return true; //减法运算 number[i] = a - b; result[i] = "("+expa+"-"+expb+")"; if(pointsGame(n-1)) return true; number[i] = b - a; result[i] = "("+expb+"-"+expa+")"; if(pointsGame(n-1)) return true; //乘法运算 number[i] = a * b; result[i] = "("+expa+"*"+expb+")"; if(pointsGame(n-1)) return true; //除法运算 if(b!=0){ number[i] = a / b; result[i] = "("+expa+"/"+expb+")"; if(pointsGame(n-1)) return true; } if(a!=0){ number[i] = b / a; result[i] = "("+expb+"/"+expa+")"; if(pointsGame(n-1)) return true; } //如果还没找到,就恢复原来的状态继续下一轮搜索 number[i] = a; number[j] = b; result[i] = expa; result[j] = expb; } } return false; } public static void main(String[] args) { PointsGame1 pg = new PointsGame1(); if(pg.pointsGame(CardsNumber)){ System.out.println("构造成功!"); }else System.out.println("构造失败!"); } }
程序运行结果如下:
请输入4张牌的值(以空格分隔):11 8 3 5 满足条件的运算表达式为:(((11.0-8.0)+5.0)*3.0) 构造成功!
【方法二】参考链接:
编程之美-24点游戏
编程之美24点游戏感悟
《编程之美》读书笔记22: 1.16 24点游戏
相关文章推荐
- jQuery中间each实施例的方法
- 安卓系统键盘弹出后不压缩控件大小
- OJ第三批——Problem Q: B 虚拟继承(虚基类)-沙发床(改错题)
- C++继承:公有,私有,保护
- C# 中new,override的区别
- springmvc开发中的乱码问题总结
- 读写kafka 0.7简单示例
- 文件流复用方法
- C++11 实现 argsort
- 内存相关命令
- Android中控件spinner的使用
- Pascal's Triangle II
- 统计图形-点图
- 安卓杀死进程关闭程序
- androidstudio导入eclipse源码和乱码问题
- LeetCode || 未完成的题目
- mac root permission
- awk向脚本传递参数(二)
- objc一个NetConnector类示例
- objc一个NetConnector类示例