您的位置:首页 > 其它

经典游戏,计算24点,简单实现

2009-10-31 08:02 696 查看
问题:一副扑克牌,每张牌表示[1,13]之间的一个整数,任意抽4张,用+-/*运算,

使得结果等于24。

分析:4个数,4种运算,选择一个计算顺序,选择3个运算符,最多不过4k种组合,

剪枝都省了,纯暴力搜索。

记4个数为a, b, c, d,运算符为op1, op2, op3,那么所有的计算组合,都可以表示

为以下两种之一:(其中,(ca, cb, cc, cd)是a,b,c,d 4个数生成的全排列中的一组)

(ca op1 cb) op2 (cc op3 cd)

(ca op1 cb) op2 cc op3 cd

现在问题已经转化成两个经典小问题:

4个数,生成全排列

4种运算,允许有重复的取3个

有了思路,代码是时间问题,随手用C写了个,只求一组解便退出,无解不输出。

#include <stdio.h>
#include <math.h>
double add(double a, double b) {return a+b;}
double sub(double a, double b) {return a-b;}
double mut(double a, double b) {return a*b;}
double div(double a, double b) {return (b<0.000001)?99999999:a/b;}
double (*op[])(double, double) = {add, sub, mut, div};
char *op_c="+-*/";
double e24(double x) {return (fabs(x-24)<0.000001);}
#define make_per(s, x,y,z) do {/
(x) = (s)/16;/
(y) = (s)%16/4;/
(z) = (s)%4;/
} while(0)
#define done(f) do {/
printf(f,a, op_c[o1], b, op_c[o2], c, op_c[o3], d);/
return 0;/
} while(0)
int main()
{
int cd[4], i, j, k, l, op_seq=64;
int o1, o2, o3, o4, a, b, c, d, n_seq;
scanf("%d%d%d%d", cd, cd+1, cd+2, cd+3);
while (op_seq--) {
make_per(op_seq, o1, o2, o3);
n_seq = 64;
while (n_seq--) {
make_per(n_seq, i, j, k);
for (l=0; l<4; l++) {
if ((i+1)*(j+1)*(k+1)*(l+1)!=24)
continue;
a=cd[i]; b=cd[j]; c=cd[k]; d=cd[l];
if ( e24( op[o2](op[o1](a,b),op[o3](c,d)) ) )
done("(%d %c %d) %c (%d %c %d)/n");
if ( e24( op[o3](op[o2](op[o1](a,b),c),d) ) )
done("((%d %c %d) %c %d) %c %d/n");
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: