HDU 1427 24点游戏

来源:互联网 发布:c语言中进制转换 编辑:程序博客网 时间:2024/06/05 16:35

题目:

Description

速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。 
 

Input

每组输入数据占一行,给定四张牌。 
 

Output

每一组输入数据对应一行输出。如果有解则输出"Yes",无解则输出"No"。 
 

Sample Input

A 2 3 63 3 8 8
 

Sample Output

YesNo


这个题目和我们玩的24点唯一的区别就是,计算过程中不能出现分数。

实际上只有水平比较高的24点玩家才会算出这种结果,比如(3+3/7)*7,或者(5-1/5)*5

这个题目忽略这种现象,把它们判定为无解,让搜索高效了一些,而且不需要涉及到实数的问题,不过写代码就多了一些判断。

主要的思路就是函数的嵌套。

这个题目我是只用一个字符ch记录所有输入的,空格会自动忽略,0我就人为忽略,遇到0就读取下一个字符,这样,A就是表示1,1就是表示10

代码:

#include<iostream>using namespace std;int number(char c){if (c == 'A')return 1;if (c == 'J')return 11;if (c == 'Q')return 12;if (c == 'K')return 13;if (c == '1')return 10;return c - '0';}bool ok(int a, int b){if (a + b == 24)return true;if (a - b == 24)return true;if (a*b == 24)return true;if (a != 0 && a == 24 * b)return true;return false;}bool ok(int a, int b, int c){if (b == 0){if (ok(a, c))return true;return false;}if (c == 0){if (ok(a, b))return true;return false;}if (ok((a + b), c) || ok((a - b), c) || ok((a * b), c))return true;if (a%b == 0 && ok(a / b, c))return true;if (ok(a, b + c) || ok(a, b - c) || ok(a, b * c))return true;if (b%c == 0 && ok(a, b / c))return true;return false;}bool ok(int a, int b, int c, int d){if (ok(a + b, c, d) || ok(a - b, c, d) || ok(a * b, c, d))return true;if (a%b == 0 && ok(a / b, c, d))return true;if (ok(a, b + c, d) || ok(a, b - c, d) || ok(a, b * c, d))return true;if (b%c == 0 && ok(a, b / c, d))return true;if (ok(a, b, c + d) || ok(a, b, c - d) || ok(a, b, c * d))return true;if (c%d == 0 && ok(a, b, c / d))return true;return false;}bool ok1(int a, int b, int c, int d){if (ok(a, b, c, d) || ok(a, c, b, d) || ok(b, a, c, d) || ok(b, c, a, d) || ok(c, a, b, d) || ok(c, b, a, d))return true;return false;}int main(){char ch;int a, b, c, d;while (cin >> ch){if (ch == '0')cin >> ch;a = number(ch);cin >> ch;if (ch == '0')cin >> ch;b = number(ch);cin >> ch;if (ch == '0')cin >> ch;c = number(ch);cin >> ch;if (ch == '0')cin >> ch;d = number(ch);if (ok1(a, b, c, d)||ok1(b,c,d,a)||ok1(c,d,a,b)||ok1(d,a,b,c))cout << "Yes" << endl;else cout << "No" << endl;}return 0;}


2 0