速算24点
2016-06-19 21:01
337 查看
题目描述
速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括 A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用’+’,’-‘,’*’,’/’运算符以及括号改变运算 顺序,使得最终运算结果为24(每张牌必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断 是否有解。我们另外规定,整个计算过程中都不能出现小数。输入
输入数据占一行,给定四张牌。输出
如果有解则输出”Y”,无解则输出”N”。样例输入
A 2 3 6样例输出
Y#include <iostream> #include <cstring> using namespace std; const int M = 30; int num[M]; bool vis[M]; int test (char a) { if (a == 'A') { return 1; } else if (a == 'J') { return 11; } else if (a == 'Q') { return 12; } else if (a == 'K') { return 13; } else { return a - '0'; } } int dfs (int n, int top) { if (n == 1) { if (num[top-1] == 24) return 1; else return 0; } for (int i = 0; i < top; ++i) { if (!vis[i]) { vis[i] = 1; for (int j = i + 1; j < top; ++j) { if (!vis[j]) { vis[j] = 1; num[top] = num[i] + num[j]; //cout << num[i] << " + " << num[j] << " = " << num[top] << endl; if (dfs(n - 1, top + 1)) return 1; num[top] = num[i] - num[j]; //cout << num[i] << " - " << num[j] << " = " << num[top] << endl; if (dfs(n - 1, top + 1)) return 1; num[top] = num[j] - num[i]; //cout << num[j] << " - " << num[i] << " = " << num[top] << endl; if (dfs(n - 1, top + 1)) return 1; num[top] = num[i] * num[j]; //cout << num[i] << " * " << num[j] << " = " << num[top] << endl; if (dfs(n - 1, top + 1)) return 1; if (num[j] && num[i] % num[j] == 0) { num[top] = num[i] / num[j]; //cout << num[i] << " / " << num[j] << " = " << num[top] << endl; if (dfs(n - 1, top + 1)) return 1; } if (num[i] && num[j] % num[i] == 0) { num[top] = num[j] / num[i]; //cout << num[j] << " / " << num[i] << " = " << num[top] << endl; if (dfs(n - 1, top + 1)) return 1; } vis[j] = 0; } } vis[i] = 0; } } return 0; } int main() { char a, b, c, d; cin >> a >> b >> c >> d; num[0] = test(a); num[1] = test(b); num[2] = test(c); num[3] = test(d); memset(vis, 0, sizeof(vis)); if (dfs(4,4)) puts("Y"); else puts("N"); return 0; }
首先转换输入,然后用一个数组来记录所有的数据,用另一个数组来记录数据是否可读,即是不是已经被用了。其中注释的输出很清楚的显示了运算过程。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C++联合体转换成C#结构的实现方法