zoukankan      html  css  js  c++  java
  • 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,其他的都是深搜模板了。

  • 相关阅读:
    Android之SQLite分页读取
    android 对sqlite数据库的增删改查
    Android如何导入已有的外部数据库(在raw下自己导入db文件)
    Android自定义对话框(Dialog)位置,大小
    android UI进阶之实现listview中checkbox的多选与记录
    Android开发教程 数据存储 SQLite
    Android 中的ORM框架
    android错误信息大整理
    C#中导出Execl
    关于用户退出,点击浏览器后退仍可回到原来页面解决二
  • 原文地址:https://www.cnblogs.com/ouyangduoduo/p/3028152.html
Copyright © 2011-2022 走看看