“24点游戏是一种使用扑克牌来进行的益智类游戏,游戏内容是:从一副扑克牌中抽去大小王剩下52张,任意抽取4张牌,把牌面上的数(A代表1)运用加、减、乘、除和括号进行运算得出24。每张牌都必须使用一次,但不能重复使用。
有些组合有不同种算法,例如要用2,4,6,12四张牌组合成24点,可以有如下几种组合方法:
当然,也有些组合算不出24,如1、1、1、1 和 6、7、8、8等组合。”
--题目描述来自wikipedia:http://zh.wikipedia.org/wiki/24%E7%82%B9。
请完成函数can24,4张牌如果可以组成24点,返回1,不能则返回0。
友情提醒:
注意以下这些组合:
1 1 1 10 不可以;
6 6 6 6 可以;
5 5 5 1 可以,即可以用分数,如(5-1/5)*5 = 24;
1 1 1 11 可以;
如果你还是不咋明白24点到底是怎么一回事,这里有一个可以在线计算24点的应用:http://www.zhongguosou.com/game_lookup_tools/game_24_point.html,可慢慢体会。
/** * 解法:假设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个。 * */ public class _24Game { double wucha = 1E-6; // 浮点除法有精度损失 double num[] = new double[4]; boolean flag; // 标记是否成功 public static void main(String[] args) { _24Game game=new _24Game(); System.out.println(game.can24(6, 6, 6, 6)); System.out.println(game.can24(2, 4, 10, 10)); System.out.println(game.can24(5, 5, 5, 1)); System.out.println(game.can24(1, 1, 1, 10)); // 不可以 System.out.println(game.can24(1, 1, 1, 11)); } /* * n,每次计算以后减1 * num[i]为第一个,时刻更新num[i]的值 * num[j]第一次计算以后,都是从最后一个值移动而来 * */ void game24(int n) { if (n == 1) { if (Math.abs(num[0] - 24) <= wucha) { flag = true; return; } } if (flag) return; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { double a, b; a = num[i]; b = num[j]; num[j] = num[n - 1]; num[i] = a + b; game24(n - 1); num[i] = a - b; game24(n - 1); num[i] = b - a; game24(n - 1); num[i] = a * b; game24(n - 1); if (b != 0) { num[i] = a / b; game24(n - 1); } if (a != 0) { num[i] = b / a; game24(n - 1); } num[i] = a; num[j] = b; } } } int can24(int a, int b, int c, int d) { num[0] = (double) (a); num[1] = (double) (b); num[2] = (double) (c); num[3] = (double) (d); flag = false; game24(4); if (flag) return 1; else return 0; } }
转载请注明本文出处:http://blog.csdn.net/love254443233