l 问题
算24点游戏是一种经典的用扑克牌来进行的益智游戏。游戏内容是:从一副扑克牌中抽去大小王剩下52张,任意抽取4张牌,把牌面上的数字(J、Q、K、A分别代表11、12、13、1)运用加、减、乘、除和括号进行运算得出24。每张牌都必须使用一次,但不能重复使用。
请编写代码对任意给出的四张牌算24点,用文本输出解答,如果无解则输出“无解”。
l 思路
1. 将4个数字按照不同的顺序进行排列
2. 在1的循环中,将4个运算符取其中三个并且按照不同的方式进行排列
3. 在2的循环中,将三个符号添加到四个数字之间
4. 枚举了以下5种括号情况分别计算(其中A,B,C,D表示数字,#表示不同的符号):
l ((A#B)#C)#D
l (A#(B#C))#D
l (A#B)#(C#D)
l A#((B#C)#D)
l A#(B#(C#D))
l 代码
|
A |
B |
C |
D |
|
1 |
[3,3,8,8] |
|
|
|
|
2 |
[1234,1243,1324,1342,1423,1432,2134,2143,2314,2341,2413,2431, 3124,3142,3214,3241,3412,3421,4123,4132,4213,4231,4312,4321] |
|
|
|
|
3 |
for A2 |
=A1(4.(int(A3/power(10,4-#))%10)) |
|
|
将A1中的成员按照A2排列 |
4 |
|
for 64 |
|
|
在+,_,*,/四个运算符中取任意3个,可以相同,因此每一个都有四种选择,相当于4×4×4,等于64种 |
5 |
|
|
=["+","-","*","/"](3.(int((B4-1)/power(4,3-#))%4+1)) |
|
把循环序号转成四进制数且每位加1,即为当前的运算符选法 |
6 |
|
|
>a=B3(1),b=B3(2),c=B3(3),d=B3(4),x=C5(1),y=C5(2),z=C5(3) |
|
|
7 |
|
|
=func(A28,[x,a,func(A28,[y,b,func(A28,[z,c,d])])]) |
|
给表达式添加括号,该表达式为A#(B#(C#D)),然后调用子程序进行计算 |
8 |
|
|
if abs(C7-24)<0.0001 |
|
|
9 |
|
|
|
=string(a)+x+"("+string(b)+y+"("+string(c)+z+string(d)+"))" |
|
10 |
|
|
|
=D10|D9 |
如果表达式的值等于24,存储结果 |
11 |
|
|
=func(A28,[x,a,func(A28,[z,func(A28,[y,b,c]),d])]) |
|
给表达式添加括号,该表达式为A#((B#C)#D),然后调用子程序进行计算 |
12 |
|
|
if abs(C11-24)<0.0001 |
|
|
13 |
|
|
|
=string(a)+x+"(("+string(b)+y+ string(c)+")"+z+string(d)+")" |
|
14 |
|
|
|
=D14|D13 |
如果表达式的值等于24,存储结果 |
15 |
|
|
=func(A28,[y,func(A28,[x,a,b]),func(A28,[z,c,d])]) |
|
给表达式添加括号,该表达式为(A#B)#(C#D),然后调用子程序进行计算 |
16 |
|
|
if abs(C15-24)<0.0001 |
|
|
17 |
|
|
|
="("+string(a)+x+string(b)+")"+y+"("+string(c)+z+string(d)+")" |
|
18 |
|
|
|
=D18|D17 |
如果表达式的值等于24,存储结果 |
19 |
|
|
=func(A28,[z,func(A28,[y,func(A28,[x,a,b]),c]),d]) |
|
给表达式添加括号,该表达式为((A#B)#C)#D,然后调用子程序进行计算 |
20 |
|
|
if abs(C19-24)<0.0001 |
|
|
21 |
|
|
|
="(("+string(a)+x+string(b)+")"+y+string(c)+")"+z+string(d) |
|
22 |
|
|
|
=D22|D21 |
如果表达式的值等于24,存储结果 |
23 |
|
|
=func(A28,[z,func(A28,[x,a,func(A28,[y,b,c])]),d]) |
|
给表达式添加括号,该表达式为(A#(B#C))#D,然后调用子程序进行计算 |
24 |
|
|
if abs(C23-24)<0.0001 |
|
|
25 |
|
|
|
="("+string(a)+x+"("+string(b)+y+string(c)+"))"+z+string(d) |
|
26 |
|
|
|
=D26|D25 |
如果表达式的值等于24,存储结果 |
27 |
=[D10,D14,D18,D22,D26].union().id() |
|
|
|
运算结果 |
28 |
func |
|
|
|
三个参数,第一个参数是运算符,第二个参数是左操作数,第三个参数是右操作数 |
29 |
|
if A28(1)=="+" |
return A28(2)+A28(3) |
|
|
30 |
|
if A28(1)=="-" |
return A28(2)-A28(3) |
|
|
31 |
|
if A28(1)=="*" |
return A28(2)*A28(3) |
|
|
32 |
|
if A28(1)=="/" |
return A28(2)/A28(3) |
|
|
l 结果