题目详情
“24点游戏是一种使用扑克牌来进行的益智类游戏,游戏内容是:从一副扑克牌中抽去大小王剩下52张,任意抽取4张牌,把牌面上的数(A代表1)运用加、减、乘、除和括号进行运算得出24。每张牌都必须使用一次,但不能重复使用。
有些组合有不同种算法,例如要用2,4,6,12四张牌组合成24点,可以有如下几种组合方法:
- 2 + 4 + 6 + 12 = 24
- 4 × 6 ÷ 2 + 12 = 24
- 12 ÷ 4 × (6 + 2) = 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