24点游戏

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

2424点就是给你一串数字,问你是否通过加减乘除括号构成2424点。

沈爷觉得这个很好玩,就决定考考你,给你44个数,可以交换位置,可以用加减乘除和括号,是否能构成2424点呢?

注意哦~这里的除法并不是整数除法,比如样例

Input

第一行TT,表示有多少组测试数据,1≤T≤501≤T≤50

接下来TT行,每行44个正整数a1a1, a2a2, a3a3, a4a4,表示每个数都是多少,1≤ai≤131≤ai≤13

Output

对于每一次询问,如果能够凑成2424点,输出yes,否则输出no

Sample input and output

Sample Input Sample Output
  1. 2
  2. 3 3 8 8
  3. 1 1 1 1
  1. yes
  2. no

Hint

33 33 88 88

就可以构造出 8÷(3–8÷3)=24

题解:求24点,暴力搜索下就好,刚开始我想着全排列下,然后按照顺序来进行,但是思路明显不完善,然后看了大神的,

大神是延长数组存放当前运算的解,vis记录是否用过,思路很巧妙;很简单就A过了;

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<map>
  7. #include<string>
  8. #include<vector>
  9. using namespace std;
  10. const int INF=0x3f3f3f3f;
  11. #define SI(x) scanf("%d",&x)
  12. #define PI(x) printf("%d",x)
  13. #define P_ printf(" ")
  14. #define mem(x,y) memset(x,y,sizeof(x))
  15. typedef long long LL;
  16. int flot;
  17. double a[];
  18. int vis[];
  19. /*void dfs(int pos,double cur);
  20. void ary(int num){
  21. if(flot)return;
  22. if(num==4){
  23. // for(int i=0;i<4;i++)printf("%d ",ans[i]);puts("");
  24. dfs(1,ans[0]);
  25. return;
  26. }
  27. for(int i=0;i<4;i++){
  28. if(vis[i])continue;
  29. ans[num]=a[i];
  30. vis[i]=1;
  31. ary(num+1);
  32. vis[i]=0;
  33. }
  34. }
  35. */
  36. void dfs(int usd,int tp){
  37. if(flot)return;
  38. if(usd==){
  39. if(abs(a[tp-]-)<1e-)flot=;
  40. return;
  41. }
  42. /*
  43. dfs(pos+1,cur+ans[pos]);
  44. dfs(pos+1,cur-ans[pos]);
  45. dfs(pos+1,cur*ans[pos]);
  46. dfs(pos+1,cur/ans[pos]);
  47. dfs(pos+1,-cur*ans[pos]);
  48. dfs(pos+1,-cur/ans[pos]);
  49. dfs(pos+1,ans[pos]/cur);
  50. dfs(pos+1,ans[pos]/cur);
  51. */
  52. for(int i=;i<tp;i++){
  53. if(vis[i])continue;
  54. vis[i]=;
  55. for(int j=i+;j<tp;j++){
  56. if(vis[j])continue;
  57. vis[j]=;
  58. a[tp]=a[i]+a[j];dfs(usd+,tp+);
  59. a[tp]=a[i]*a[j];dfs(usd+,tp+);
  60. a[tp]=a[i]-a[j];dfs(usd+,tp+);
  61. a[tp]=a[j]-a[i];dfs(usd+,tp+);
  62. if(a[i]!=){
  63. a[tp]=a[j]/a[i];dfs(usd+,tp+);
  64. }
  65. if(a[j]!=){
  66. a[tp]=a[i]/a[j];dfs(usd+,tp+);
  67. }
  68. vis[j]=;
  69. }
  70. vis[i]=;
  71. }
  72. }
  73. int main(){
  74. int T;
  75. SI(T);
  76. while(T--){
  77. for(int i=;i<;i++)scanf("%lf",&a[i]);
  78. flot=;
  79. mem(vis,);
  80. dfs(,);
  81. if(flot)puts("yes");
  82. else puts("no");
  83. }
  84. return ;
  85. }

速算24点

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

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

题解:跟上题不同的是,这个是字符输入,而且,是整除的;注意10的读入。。。

虽然写过,但是比赛出到还是不会。。。这个题思路就是dfs,a[tp - 1]代表当前usd的个数的计算值。

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #include<queue>
  7. using namespace std;
  8. int a[];
  9. int vis[];
  10. int ans;
  11. void dfs(int usd, int tp){
  12. if(ans)return;
  13. if(usd == ){
  14. if(a[tp - ] == )ans = ;
  15. return;
  16. }
  17. for(int i = ; i < tp; i++){
  18. if(vis[i])continue;
  19. vis[i] = ;
  20. for(int j = i + ; j < tp; j++){//注意应该从i + 1开始,可以让时间减少一般否则会超时;
  21. if(vis[j])continue;
  22. vis[j] = ;
  23. a[tp] = a[i] + a[j];dfs(usd + , tp + );
  24. a[tp] = a[i] - a[j];dfs(usd + , tp + );
  25. a[tp] = a[j] - a[i];dfs(usd + , tp + );
  26. a[tp] = a[i] * a[j];dfs(usd + , tp + );
  27.  
  28. if(a[j] != && a[i] % a[j] == ){
  29. a[tp] = a[i] / a[j];dfs(usd + , tp + );
  30. }
  31. if(a[i] != && a[j] % a[i] == ){
  32. a[tp] = a[j] / a[i];dfs(usd + , tp + );
  33. }
  34.  
  35. vis[j] = ;
  36. }
  37. vis[i] = ;
  38. }
  39. }
  40. int main(){
  41. char s[][];
  42. while(~scanf("%s %s %s %s",s[],s[],s[],s[])){
  43. for(int i =;i < ;i++){
  44. if(strlen(s[i]) == )a[i] = ;
  45. else if(s[i][] == 'A')a[i] = ;
  46. else if(s[i][] == 'J')a[i] = ;
  47. else if(s[i][] == 'Q')a[i] = ;
  48. else if(s[i][] == 'K')a[i] = ;
  49. else a[i] = s[i][] - '';
  50. }
  51. ans = ;
  52. memset(vis, , sizeof(vis));
  53. dfs(, );
  54. if(ans)
  55. puts("Yes");
  56. else
  57. puts("No");
  58. }
  59. return ;
  60. }

24点游戏&&速算24点(dfs)的更多相关文章

  1. hdu 1427 速算24点

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

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

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

  3. HDU 1427 速算24点【数值型DFS】

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

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

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

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

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

  6. hdu1427之速算24点

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

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

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

  8. HDOJ 1427(dfs) 速算24点

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

  9. hdu1427 速算24点

    </pre><pre> //#pragma comment(linker, "/STACK:102400000,102400000") //HEAD #in ...

随机推荐

  1. python刷取CSDN博文访问量之二

    python刷取CSDN博文访问量之二 作者:vpoet 注:这个系列我只贴代码,代码不注释.有兴趣的自己读读就懂了,纯属娱乐,望管理员抬手      若有转载一定不要注明来源 #coding=utf ...

  2. 关于xhEditor

    关于xhEditor xhEditor是一个基于jQuery开发的简单迷你并且高效的在线可视化HTML编辑器,基于网络访问并且兼容IE 6.0+,Firefox 3.0+,Opera 9.6+,Chr ...

  3. Android消息机制不完全解析(上)

        Handler和Message是Android开发者常用的两个API,我一直对于它的内部实现比较好奇,所以用空闲的时间,阅读了一下他们的源码.    相关的Java Class: androi ...

  4. Scala 函数(五)

    函数是一组一起执行一个任务的语句. 您可以把代码划分到不同的函数中.如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的. Scala 有函数和方法, ...

  5. Java连接各类数据库

    几种常用数据库的连接,以及Dao层的实现. 1.加载JDBC驱动: 1 加载JDBC驱动,并将其注册到DriverManager中: 2 //MySQL数据库 3 Class.forName(&quo ...

  6. 高效CSS書寫規範及CSS兼容性

    一.選擇器針對性說明 某一元素的多个规则集中,选择器的针对性越高,该规则集的权重也就越高.针对性相同的,后出现的规则集的权重更高. * {} /* a=0 b=0 c=0 d=0 -> spec ...

  7. PHP在Windows下安装配置第一步

    第一步就是下载和安装PHP解释器了: 1.下载Windows版本号的PHP解释器,下载地址:官方下载 我下载的是 VC11 x64 Thread Safe 这个以下的zip包 2.下载完毕后,解压到 ...

  8. SQL Server 2008 修改表名

     有一张表  修改起 if exists (select * from sys.objects where object_id = object_id(N'Table_1') and type in ...

  9. Linux下安装oracle11g

    1.安装环境: Linux:Redhat Enterprise Linux 6.3 64位 Oracle:Oracle Database 11g for Linux x86-64 64位 2.修改操作 ...

  10. json 去空值与缩进

    var jSetting = new Newtonsoft.Json.JsonSerializerSettings(); //忽略值为null的 jSetting.NullValueHandling ...