问题
1219: 速算24点
时间限制: 1 Sec 内存限制: 128 MB
提交: 381 解决: 89
速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括 A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算 顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断 是否有解。我们另外规定,整个计算过程中都不能出现小数。
输入
输入数据占一行,给定四张牌。
输出
如果有解则输出"Y",无解则输出"N"。
样例输入 Copy
A 2 3 6
样例输出 Copy
Y
A大佬代码
思路:
多了处理字符串这一点,还有需要判断能否整除,
因为题目要求计算过程不能出现小数。
用数组存储这4个数
以及这4个数中任意两个之间的加减乘除的结果
(记录结果时,不要用数组下标自增一,
因为当前存储的结果 可能不是 正确达到24的中间的结果)。
每次取没有使用的两个数,继续进行加减乘除的操作。
等到使用数字个数达到4时,判断当前结果有没有达到24。
注意过程中不能出现小数!
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int num[10];
bool vis[10];
int toDec(char x);
int dfs(int use, int total);
int main()
{
char a[4][2];
int i, j;
while(scanf("%s%s%s%s", a[0], a[1], a[2], a[3]) != EOF)
{
for(i = 0; i < 4; i++)
{
if(strlen(a[i]) > 1)
num[i] = 10;
else
num[i] = toDec(a[i][0]);
}
memset(vis, false, sizeof(vis));