24点游戏

描述

几十年前全世界就流行一种数字扑克游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”。您作为游戏者将得到4个1-13(在扑克牌里用A代替1,J代替11,Q代替12,K代替13)之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,判断运算结果是否等于24。能输出1,不能输出0。

格式

输入格式

四个牌面值。牌面值与牌面值之间用一个空格隔开。

输出格式

输出0或1。

样例1

样例输入1[复制]

3 8 10 Q

样例输出1[复制]

1

限制

每个测试点1s

 

View Code
  1 #include<iostream>
  2 #include<stdio.h>
  3 #include<string.h>
  4 #include<cmath>
  5 #define exp 1e-6
  6 using namespace std;
  7 int dd[5];
  8 bool flag[5];
  9 bool mark;
 10 void dfs(int step,double sum)
 11 {
 12     if(step==4)
 13     {
 14         if(fabs(sum-24)<exp)
 15         {
 16             mark=true;
 17         }
 18         return;
 19     }
 20     if(mark)
 21         return;
 22     int i;
 23     for(i=0;i<4;i++)
 24     {
 25         if(!flag[i])
 26         {
 27             
 28             flag[i]=true;
 29             dfs(step+1,sum*dd[i]*1.0);
 30             if(mark)
 31                 return;
 32             dfs(step+1,sum+dd[i]*1.0);
 33             if(mark)
 34                 return;
 35             dfs(step+1,sum-dd[i]*1.0);
 36             if(mark)
 37                 return;
 38             dfs(step+1,dd[i]*1.0-sum);
 39             if(mark)
 40                 return;
 41             if(dd[i]!=0)
 42             {
 43                 dfs(step+1,sum/(dd[i]*1.0));
 44                 if(mark)
 45                     return;
 46             }
 47             if(sum!=0)
 48             {
 49                 dfs(step+1,(dd[i]*1.0)/sum);
 50                 if(mark)
 51                     return;
 52             }
 53             flag[i]=false;
 54         }
 55     }
 56 }
 57 
 58 int main()
 59 {
 60     char num[5][5];
 61     
 62     while(~scanf("%s",num[0]))
 63     {
 64         if(num[0][0]=='2' || num[0][0]=='3' ||num[0][0]=='4' || num[0][0]=='5' || num[0][0]=='6' || num[0][0]=='7' || num[0][0]=='8' || num[0][0]=='9')
 65             dd[0]=num[0][0]-'0';
 66         else if(num[0][0]=='A')
 67             dd[0]=1;
 68         else if(num[0][0]=='J')
 69             dd[0]=11;
 70         else if(num[0][0]=='Q')
 71             dd[0]=12;
 72         else if(num[0][0]=='K')
 73             dd[0]=13;
 74         else
 75             dd[0]=10;
 76         int i;
 77         for(i=1;i<4;i++)
 78         {
 79             scanf("%s",num[i]);
 80             if(num[i][0]=='2' || num[i][0]=='3' ||num[i][0]=='4' || num[i][0]=='5' || num[i][0]=='6' || num[i][0]=='7' || num[i][0]=='8' || num[i][0]=='9')
 81                 dd[i]=num[i][0]-'0';
 82             else if(num[i][0]=='A')
 83                 dd[i]=1;
 84             else if(num[i][0]=='J')
 85                 dd[i]=11;
 86             else if(num[i][0]=='Q')
 87                 dd[i]=12;
 88             else if(num[i][0]=='K')
 89                 dd[i]=13;
 90             else
 91                 dd[i]=10;
 92         }
 93         memset(flag,false,sizeof(flag));
 94         mark=false;
 95         for(i=0;i<4;i++)
 96         {
 97             flag[i]=true;
 98             dfs(1,dd[i]*1.0);
 99             flag[i]=false;
100         }
101         if(mark)
102             printf("1\n");
103         else
104             printf("0\n");
105     }
106     return 0;
107 }

这是一道深搜题目,首先计算所有的排列顺序,运用所有的运算符号,这样可以忽略括号带来的运算优先级的不同,值得注意的是减法和除法运算要考虑a-b和b-a两种可能,a/b 和b/a,还必须保证分母不能为0,其他的都是深搜模板了。

 

转载于:https://www.cnblogs.com/ouyangduoduo/archive/2013/04/18/3028152.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值