hdoj 1427 速算24点 【经典DFS】
2015-06-18 21:51
155 查看
Total Submission(s): 3664 Accepted Submission(s): 899
Problem 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
Sample Output
同上一篇解题,就是多了处理字符串这一点,还有需要判断能否整除,因为题目要求计算过程不能出现小数。
思路:用数组存储这4个数以及这4个数中任意两个之间的加减乘除的结果(记录结果时,不要用数组下标自增一,因为当前存储的结果 可能不是 正确达到24的中间的结果)。每次取没有使用的两个数,继续进行加减乘除的操作。等到操作次数达到4时,判断当前结果有没有达到24。 注意过程中不能出现小数!
速算24点
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3664 Accepted Submission(s): 899
Problem 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 6 3 3 8 8
Sample Output
Yes No
同上一篇解题,就是多了处理字符串这一点,还有需要判断能否整除,因为题目要求计算过程不能出现小数。
思路:用数组存储这4个数以及这4个数中任意两个之间的加减乘除的结果(记录结果时,不要用数组下标自增一,因为当前存储的结果 可能不是 正确达到24的中间的结果)。每次取没有使用的两个数,继续进行加减乘除的操作。等到操作次数达到4时,判断当前结果有没有达到24。 注意过程中不能出现小数!
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int num[10];//存储4个数字 和 通过数字得到的 结果 bool vis[10];//标记当前数字 或者 结果是否使用过 int bian(char x) { if(x == 'A') return 1; else if(x >= '1' && x <= '9') return x - '0'; else if(x == 'J') return 11; else if(x == 'Q') return 12; else if(x == 'K') return 13; } int dfs(int use, int total)//use 已使用的数字个数 total 数组存储的数字及结果个数 { int i, j; if(use == 4)//已用4个数字 判定最新结果 { if(num[total-1] == 24) return 1; else return 0; } for(i = 0; i < total-1; i++) { if(vis[i]) continue;//已经使用 vis[i] = true; for(j = i+1; j < total; j++) { if(vis[j]) continue; vis[j] = true; num[total] = num[i] + num[j]; if(dfs(use+1, total+1)) return 1; num[total] = num[i] - num[j]; if(dfs(use+1, total+1)) return 1; num[total] = num[j] - num[i]; if(dfs(use+1, total+1)) return 1; num[total] = num[i] * num[j]; if(dfs(use+1, total+1)) return 1; if(num[j]) { if(num[i] % num[j] == 0) { num[total] = num[i] / num[j]; if(dfs(use+1, total+1)) return 1; } } if(num[i]) { if(num[j] % num[i] == 0) { num[total] = num[j] / num[i]; if(dfs(use+1, total+1)) return 1; } } vis[j] = false;//搜索失败 去掉标记 } vis[i] = false;//去标记 } return 0; } 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] = bian(a[i][0]); } memset(vis, false, sizeof(vis)); if(dfs(1, 4)) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- 【ContestHunter】【弱省胡策】【Round7】
- 自动化辅助工具Firebug和Firepath的安装
- 《人,绩效和职业道德》及博客读后感
- 使用Canvas绘制图形的基本教程
- 在windows下如何批量转换pvr,ccz为png或jpg
- 得成CMMI大牛
- 冒泡排序与快速排序
- KDE desktop environment
- DAG上的动态规划------硬币问题
- 检查HTTP 的 Digest 认证代码示例-JSP
- 习题3-43
- 【排列组合】bzoj3505 [Cqoi2014]数三角形
- 黑马程序员--异常处理--2nd day
- Java并发编程-27-异常处理及取消任务
- 剑指offer-第四章解决面试题的思路(二叉树的镜像)
- 【枚举】bzoj3391 [Usaco2004 Dec]Tree Cutting网络破坏
- 前端优化-Img与background
- 图算法 专题
- 【半平面交】bzoj2618 [Cqoi2006]凸多边形
- MincostMaxflow