速算24点

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2562    Accepted Submission(s): 606

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
【分析】:

简单的DFS,dfs(sum,next,p)表示当前已经算出的值是sum,括号中算出的值是next,当前使用的卡片下标为p,实际上是把括号外和括号内的两部分值分成sum和next来处理了。

直觉告诉我们4个数只需要一层括号参与运算就够了,不会也不必用多重括号改变运算顺序,因此上面的dfs思路是正确的。

那么对于下一张卡片,有两种处理方式:

1、把next算入sum中,下一张卡片成了新的括号中的算式的值。

2、把下一张卡片的值算入next中,下一张卡片加入了括号中。

这道题直接暴力有点不和谐,所以可以用next_permutation()来做,总结一下,其实所有运算都可以归结为两类,一类是( ( a@b) @c) @d 另一类是 ( a@b ) @ (c@d) 因为只有四个数,所以这么做没问题,但当操作数增多的时候就有点麻烦了,这时候可以考虑递归来做

对于上述两种处理方式,每种方式又分成加减乘除四种情况讨论,而对于除法这种情况需要特殊处理,除数不能为0,而且题目中要求运算过程中不能出现小数,因此在做除法运算前需要检查。

【代码】:

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <string>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. int cardNum[]; //cardNum[i]=第i张牌的数字大小
  11. bool flag=false; //flag=true表明能算出24点
  12.  
  13. int getNum(string s) //扑克牌编号s转数字
  14. {
  15. if(s[]>=''&&s[]<='') return s[]-'';
  16. if(s=="") return ;
  17. switch(s[])
  18. {
  19. case 'A': return ;
  20. case 'J': return ;
  21. case 'Q': return ;
  22. case 'K': return ;
  23. }
  24. }
  25.  
  26. void dfs(int sum,int next,int p) //表示当前已经算出的值是sum,括号中算出的值是next,当前使用的卡片下标为p
  27. {
  28. if(p==) //正在用第4张牌
  29. {
  30. if(sum+next==||sum-next==||sum*next==)
  31. flag=true;
  32. if(next!=&&sum%next==&&sum/next==)
  33. flag=true;
  34. return;
  35. }
  36. //1、不加括号
  37. dfs(sum+next,cardNum[p+],p+);
  38. dfs(sum-next,cardNum[p+],p+);
  39. dfs(sum*next,cardNum[p+],p+);
  40. if(next!=&&sum%next==)
  41. dfs(sum/next,cardNum[p+],p+);
  42. //2、加括号,则需要改变运算顺序
  43. dfs(sum,next+cardNum[p+],p+);
  44. dfs(sum,next-cardNum[p+],p+);
  45. dfs(sum,next*cardNum[p+],p+);
  46. if(cardNum[p+]!=&&next%cardNum[p+]==)
  47. dfs(sum,next/cardNum[p+],p+);
  48. }
  49.  
  50. int main()
  51. {
  52. string in;
  53. while(cin>>in)
  54. {
  55. flag=false;
  56. cardNum[]=getNum(in);
  57. for(int i=;i<=;i++)
  58. {
  59. cin>>in;
  60. cardNum[i]=getNum(in);
  61. }
  62. sort(cardNum+,cardNum+);
  63. do
  64. {
  65. dfs(cardNum[],cardNum[],);
  66. }while(!flag&&next_permutation(cardNum+,cardNum+));
  67. if(flag)
  68. printf("Yes\n");
  69. else
  70. printf("No\n");
  71. }
  72. return ;
  73. }

数值型DFS

HDU 1427 速算24点【数值型DFS】的更多相关文章

  1. hdu 1427 速算24点

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1427 速算24点 Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A( ...

  2. hdu 1427 速算24点【暴力枚举】

    速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  3. hdu 1427 速算24点 dfs暴力搜索

    速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem De ...

  4. HDU 1427 速算24点 (深搜)

    题目链接 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用' ...

  5. 24点游戏&&速算24点(dfs)

    24点游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  6. hdu1427之速算24点

    速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  7. Hdu1427 速算24点 2017-01-18 17:26 46人阅读 评论(0) 收藏

    速算24点 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submiss ...

  8. HDU 1015 Safecracker【数值型DFS】

    Safecracker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  9. HDOJ 1427(dfs) 速算24点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1427 思路分析: 题目要求判断是否存在一种运算组合使得4个数的计算结果为24,因为搜索的层次为3层,不 ...

随机推荐

  1. 【2017.12.22.A】

                                A 题面: 给一个n个点m条边的无向图,你可以选择一个点作为起点,然后沿着图中的边开始走,走的过程中,同一条边不能经过两次(相反的方向也不行). ...

  2. 模拟赛 yjqa

    考场上怕是石乐志. 状态设计还是很自然的,求什么设什么. f[i]表示前i个人安排好,电梯最早回到0层的时间 转移的话,枚举上一次最后一个带走的是谁 f[i]=min(max(f[j],t[i])+2 ...

  3. 【NOIP 模拟赛】中值滤波 打表找规律

    对于这样看起来不像什么算法也没什么知识点的题,一脸懵逼的话不是手推规律就是打表找规律......... 当然还有一些超出你能力之外的数学题...... #include <cstdio> ...

  4. [bzoj 2733]启发式合并权值线段树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 平衡树待学习.从一个博客学到了合并权值线段树的姿势:http://blog.csdn ...

  5. [hdu 2102]bfs+注意INF

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的……把INF改成I ...

  6. Centos7下redis设置密码、开放远程访问权限

    redis的安装与启动可参考前一篇文章:http://www.cnblogs.com/zuidongfeng/p/8032505.html redis安装成功后,默认是没有设置密码的启动redis-c ...

  7. 面向对象的tab选项卡实现

    利用最基础的面向对象的思想,实现tab选项卡效果: 效果截图:

  8. 在Servlet中出现一个输出中文乱码的问题

     添加:reqeust.setCharacterEncoding("utf-8");

  9. 汕头市队赛 C KMP codeforces B. Image Preview

    汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> ...

  10. bzoj 1601 最小生成树

    原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1601 最小生成树的比较水的题,我们只需要加一个源点,连向所有的点,边权为每个点建水库的代价 ...