雨人速算24点(HDU1427)
2016-07-25 10:24
169 查看
速算24点
题目
Time Limit:1000MS Memory Limit:32768KBDescription
速算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
分析
本题就是暴力DFS,需要注意的有一是没有小数,二是要发现其实运算顺序有且仅有两种,假设四个数据的一种排列为a,b,c,d,那么仅有((a?b)?c)?d和(a?b)?(c?d)两种运算顺序。这样就可以分类进行深搜。其次algorithm中自带的next_permutation可以按照字典序生成下一个排列从而求出全排列,在本题中使用也是相当方便的。代码
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; char in[4][3]; int a[4]; bool judge; void dfs(int sum, int next, int p) { if(p==3) { if(sum+next==24||sum-next==24||sum*next==24) judge=true; if(next!=0 && sum%next==0 && sum/next==24) judge=true; return; } dfs(sum+next,a[p+1],p+1); dfs(sum-next,a[p+1],p+1); dfs(sum*next,a[p+1],p+1); if(next!=0&&sum%next==0) dfs(sum/next,a[p+1],p+1); dfs(sum,next+a[p+1],p+1); dfs(sum,next-a[p+1],p+1); dfs(sum,next*a[p+1],p+1); if(a[p+1]!=0&&next%a[p+1]==0) dfs(sum,next/a[p+1],p+1); } int main() { while(scanf("%s%s%s%s",in[0],in[1],in[2],in[3]) == 4) { judge = false; for(int i=0;i<4;i++) { if(*(in[i]) == 'A') a[i] = 1; else if(*(in[i]) == 'J') a[i] = 11; else if(*(in[i]) == 'Q') a[i] = 12; else if(*(in[i]) == 'K') a[i] = 13; else if(*(in[i]) == '1' && *(in[i]+1) == '0') a[i] = 10; else { a[i] = *(in[i]) - '0'; } } sort(a,a+4); do{ dfs(a[0],a[1],1); }while(next_permutation(a,a+4) && !judge); if(judge) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- Win2003利用dfs(分布式文件系统)在负载均衡下的文件同步配置方案
- win2003分布式文件系统(dfs)配置方法[图文详解]
- win2003分布式文件系统及其部署 图文教程
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- Hadoop2.6+jdk8的安装部署(1)——使用jar包安装部署【详细】
- Hadoop FS Shell
- DFS使用方法总结
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- FastDFS注意事项
- 无忧技术带您预览DFS(分布式文件系统)管理控制台
- 矩阵的乘法操作
- C 语言实现迷宫 DFS算法