题目描述:
一副扑克牌的每张牌表示一个数(J、Q、K分别表示11、12、13,两个司令都表示6)。任取4张牌,即得到4个1~13的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个运算式。每个数只能参与一次运算,4个数顺序可以任意组合,4个运算符任意取3个且可以重复取。运算遵从一定优先级别,可加括号控制,最终使运算结果为24。请输出一种解决方案的表达式,用括号表示运算优先。如果没有一种解决方案,则输出-1表示无解。
输入格式说明:
输入在一行中给出4个整数,每个整数取值在[1, 13]。
输出格式说明:
输出一种解决方案的表达式,用括号表示运算优先。如果没有解决方案,请输出-1。
样例输入与输出:
解答说明:
四个操作数,三个操作符,两个括号,有以下五种计算模式
((A op B) op C) op D
(A op (B op C)) op D
A op (B op (C op D))
A op ((B op C) op D)
(A op B) op (C op D)
将每一种模式写成函数,最后采用穷举法找到计算结果为24的算式。
源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
//注意要在输出结果后面加\n,不然会有格式错误,坑爹啊!!! #include "stdio.h" #include "stdlib.h" char op[5]={ '#' , '+' , '-' , '*' , '/' ,}; float cal( float x, float y, int op) { switch (op) { case 1: return x+y; case 2: return x-y; case 3: return x*y; case 4: return x/y; } } float calculate_model1( float i, float j, float k, float t, int op1, int op2, int op3) { float r1,r2,r3; r1 = cal(i,j,op1); r2 = cal(r1,k,op2); r3 = cal(r2,t,op3); return r3; } float calculate_model2( float i, float j, float k, float t, int op1, int op2, int op3) { float r1,r2,r3; r1 = cal(j,k,op2); r2 = cal(i,r1,op1); r3 = cal(r2,t,op3); return r3; } float calculate_model3( float i, float j, float k, float t, int op1, int op2, int op3) { float r1,r2,r3 ; r1 = cal(k,t,op3); r2 = cal(j,r1,op2); r3 = cal(i,r2,op1); return r3; } float calculate_model4( float i, float j, float k, float t, int op1, int op2, int op3) { float r1,r2,r3; r1 = cal(j,k,op2); r2 = cal(r1,t,op3); r3 = cal(i,r2,op1); return r3; } float calculate_model5( float i, float j, float k, float t, int op1, int op2, int op3) { float r1,r2,r3 ; r1 = cal(i,j,op1); r2 = cal(k,t,op3); r3 = cal(r1,r2,op2); return r3; } int get24( int i, int j, int k, int t) { int op1,op2,op3; int flag=0; for (op1=1;op1<=4;op1++) for (op2=1;op2<=4;op2++) for (op3=1;op3<=4;op3++) { if (calculate_model1(i,j,k,t,op1,op2,op3)==24){ printf ( "((%d%c%d)%c%d)%c%d\n" ,i,op[op1],j,op[op2],k,op[op3],t);flag = 1; goto OUT; } if (calculate_model2(i,j,k,t,op1,op2,op3)==24){ printf ( "(%d%c(%d%c%d))%c%d\n" ,i,op[op1],j,op[op2],k,op[op3],t);flag = 1; goto OUT; } if (calculate_model3(i,j,k,t,op1,op2,op3)==24){ printf ( "%d%c(%d%c(%d%c%d))\n" ,i,op[op1],j,op[op2],k,op[op3],t);flag = 1; goto OUT; } if (calculate_model4(i,j,k,t,op1,op2,op3)==24){ printf ( "%d%c((%d%c%d)%c%d)\n" ,i,op[op1],j,op[op2],k,op[op3],t);flag = 1; goto OUT; } if (calculate_model5(i,j,k,t,op1,op2,op3)==24){ printf ( "(%d%c%d)%c(%d%c%d)\n" ,i,op[op1],j,op[op2],k,op[op3],t);flag = 1; goto OUT; } } OUT: return flag; } int main() { int x,y,m,n; int i,j,k,t; int in[4]; int flag; for (i=0;i<4;i++) scanf ( "%d" ,&in[i]); for (i=0;i<4;i++){ for (j=0;j<4;j++){ if (j==i) continue ; for (k=0;k<4;k++){ if (i==k||j==k) continue ; for (t=0;t<4;t++){ if (t==i||t==j||t==k) continue ; x = in[i]; y = in[j]; m = in[k]; n = in[t]; flag = get24(x,y,m,n); if (flag ==1) goto END; } } } } if (flag == 0) printf ( "-1\n" ); END: // system("pause"); return 0; } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/wutongyu0113/article/details/39738019