浙大PAT 2-08. 用扑克牌计算24点 (解题思路)
2014-03-18 19:37
661 查看
2-08. 用扑克牌计算24点
时间限制400 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Special
一副扑克牌的每张牌表示一个数(J、Q、K分别表示11、12、13,两个司令都表示6)。任取4张牌,即得到4个1~13的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个运算式。每个数只能参与一次运算,4个数顺序可以任意组合,4个运算符任意取3个且可以重复取。运算遵从一定优先级别,可加括号控制,最终使运算结果为24。请输出一种解决方案的表达式,用括号表示运算优先。如果没有一种解决方案,则输出-1表示无解。
输入格式说明:
输入在一行中给出4个整数,每个整数取值在[1, 13]。
输出格式说明:
输出一种解决方案的表达式,用括号表示运算优先。如果没有解决方案,请输出-1。
样例输入与输出:
序号 | 输入 | 输出 |
1 | 2 3 12 12 | ((3-2)*12)+12 |
2 | 5 5 5 5 | (5*5)-(5/5) |
3 | 1 3 5 6 | (1+(3*6))+5 |
4 | 8 13 9 4 | 8+((13-9)*4) |
5 | 2 13 7 7 | 2*(13-(7/7)) |
6 | 5 5 5 2 | -1 |
#include <iostream> using namespace std; char Oper[64][4] = { "+++", "++-", "++*", "++/", "+-+", "+--", "+-*", "+-/", "+*+", "+*-", "+**", "+*/", "+/+", "+/-", "+/*", "+//", "-++", "-+-", "-+*", "-+/", "--+", "---", "--*", "--/", "-*+", "-*-", "-**", "-*/", "-/+", "-/-", "-/*", "-//", "*++", "*+-", "*+*", "*+/", "*-+", "*--", "*-*", "*-/", "**+", "**-", "***", "**/", "*/+", "*/-", "*/*", "*//", "/++", "/+-", "/+*", "/+/", "/-+", "/--", "/-*", "/-/", "/*+", "/*-", "/**", "/*/", "//+", "//-", "//*", "///", }; double YunSuan(double x, char oper, double y) { switch(oper) { case '+':return x+y;break; case '-':return x-y;break; case '*':return x*y;break; case '/':return x/y;break; } } char Ful[30] = ""; bool DealWith(double a, double b, double c, double d) { int i, j; double sum; for(i = 0; i < 64; ++i) { sum = YunSuan(d,Oper[i][0], YunSuan( YunSuan(a, Oper[i][1], b), Oper[i][2], c ) ); if(sum == 24) { sprintf(Ful, "%.lf%c((%.lf%c%.lf)%c%.lf)", d, Oper[i][0], a, Oper[i][1], b, Oper[i][2], c); return true; } sum = YunSuan(YunSuan( YunSuan(a, Oper[i][0], b), Oper[i][1], c ),Oper[i][2], d ); if(sum == 24) { sprintf(Ful, "((%.lf%c%.lf)%c%.lf)%c%.lf", a, Oper[i][0], b, Oper[i][1], c, Oper[i][2], d); return true; } sum = YunSuan(d,Oper[i][0], YunSuan( c, Oper[i][1], YunSuan(a, Oper[i][2], b) ) ); if(sum == 24) { sprintf(Ful, "%.lf%c(%.lf%c(%.lf%c%.lf))", d, Oper[i][0], c, Oper[i][1], a, Oper[i][2], b); return true; } sum = YunSuan(YunSuan( c, Oper[i][0], YunSuan(a, Oper[i][1], b) ),Oper[i][2], d ); if(sum == 24) { sprintf(Ful, "(%.lf%c(%.lf%c%.lf))%c%.lf", c, Oper[i][0], a, Oper[i][1], b, Oper[i][2], d); return true; } sum = YunSuan(YunSuan(a, Oper[i][0], b), Oper[i][1], YunSuan( c, Oper[i][2], d ) ); if(sum == 24) { sprintf(Ful, "(%.lf%c%.lf)%c(%.lf%c%.lf)", a, Oper[i][0], b, Oper[i][1], c, Oper[i][2], d); return true; } } return false; } int main() { int i, j, k, t; double a[4]; bool flag = false; for(i = 0; i < 4; ++i) cin>>a[i]; for(i = 0; i < 4; ++i) for(j = 0; j < 4; ++j) { if(i == j)continue; for(k = 0; k < 4; ++k) { if( k == i || k == j)continue; for(t = 0; t < 4; ++t) { if( t == i || t == j || t == k )continue; flag = DealWith(a[i], a[j], a[k], a[t]); if(flag) { cout<<Ful<<endl; return 0; } } } } cout<<"-1"<<endl; return 0; }
相关文章推荐
- 浙大PAT 4-08. 目录树 (解题思路)
- 2-08. 用扑克牌计算24点(25) (ZJU_PAT 数学 枚举)
- PAT_2-08. 用扑克牌计算24点
- 2-08. 用扑克牌计算24点(25) (ZJU_PAT 数学 枚举)
- 浙大PAT 3-08. 堆栈模拟队列 (解题思路)
- 2-08. 用扑克牌计算24点(25) (ZJU_PAT 数学 枚举)
- PAT 2-08 用扑克牌计算24点(C语言实现)
- PAT 2-08 用扑克牌计算24点(C语言实现)
- 浙大PAT 4-08. 目录树 (解题思路)
- 浙大PAT 4-06. 搜索树判断 (解题思路)
- 浙大PAT 1012. 数字分类 (解题思路)
- 浙大PAT 4-07. 修理牧场 (解题思路)
- 浙大PAT 2-09. 装箱问题模拟 (解题思路)
- 浙大PAT 2-10. 海盗分赃 (解题思路)
- 浙大PAT 4-09. 笛卡尔树 (解题思路)
- 浙大PAT 1013. 数素数 (解题思路)
- 浙大PAT 5-05. QQ帐户的申请与登陆 (解题思路)
- 2-08. 用扑克牌计算24点(25)
- 浙大PAT 1014. 福尔摩斯的约会 (解题思路)
- 浙大PAT 2-11. 两个有序链表序列的合并 (解题思路)