• Hihocode 1304


    http://hihocoder.com/problemset/problem/1304

    题意:就是四个数字加上运算符,看看是否可以构成二十四点。

    思路:这个题目肯定是个DFS

    搜索是这么搜的,首先有4个数字,排列的话那么就会有4!=24中组合,然后运算符,在运算符号这里,我们进行拓展,也就是由4个运算符拓展成六个运算符,+,-,*,/,~-,~/。

    这里的~-意思就是减数和被减数互换一下,~/一样的意思。这样的话,那么我们只有两种组合

    (((a ⊙ b) ⊙ c ) ⊙ d)

    ((a ⊙ b) ⊙ (c ⊙ d))

    之后我们进行枚举就可以。

    代码有点长,不过看别人的,确实有更加好的办法,这个还是算比较笨的吧。

     1 //最初的梦想,紧握手上
     2 
     3 
     4 #include <stdio.h>
     5 #include <string.h>
     6 #include <math.h>
     7 #define eps 1e-5
     8 bool used[4];
     9 int num[4];
    10 int nownum[4];
    11 int ope[3];
    12 double judge(double a,double b,int x)    //运算符
    13 {
    14     switch (x)
    15     {
    16          case 1:
    17             return a+b;
    18         case 2:
    19             return a-b;
    20         case 3:
    21             return a*b;
    22         case 4:
    23             if(fabs(b-0)>eps)
    24                 return a/b;
    25             else
    26                 return -999999;
    27         case 5:
    28             return b-a;
    29         case 6:
    30             if(fabs(a-0)>eps)
    31                 return b/a;
    32             else return -999999;
    33     }
    34 
    35 }
    36 double jud1()  //第一种判断
    37 {
    38     return judge(judge(judge(nownum[0],nownum[1],ope[0]),nownum[2],ope[1]),nownum[3],ope[2]);
    39 
    40 }
    41 
    42 double jud2()  //第二种判断
    43 {
    44     return judge(judge(nownum[0],nownum[1],ope[0]),judge(nownum[2],nownum[3],ope[1]),ope[2]);
    45 }
    46 bool calc(int deep)    //枚举运算符
    47 {
    48     if(deep>2)
    49     {
    50         if(fabs(jud1()-24)<eps)
    51             return true;
    52         if(fabs(jud2()-24)<eps)
    53             return true;
    54         return false;
    55     }
    56     for(int i =1; i<=6; i++)
    57     {
    58         ope[deep] = i;
    59         if(calc(deep+1))
    60             return true;
    61     }
    62     return false;
    63 }
    64 
    65 bool dfs(int deep)    //枚举数字
    66 {
    67     if(deep>3)
    68         return calc(0);
    69     for(int i = 0; i<4; i++)
    70         if(used[i])
    71         {
    72             used[i] = false;
    73             nownum[deep] = num[i];
    74             if(dfs(deep+1))
    75                 return true;
    76             used[i] = true;
    77         }
    78     return false;
    79 }
    80 
    81 
    82 int main()
    83 {
    84    // freopen("in.txt","r",stdin);
    85     int a,b,c,d;
    86     int t;
    87     scanf("%d",&t);
    88     while(t--)
    89     {
    90         memset(used,true,sizeof(used));
    91         scanf("%d%d%d%d",&num[0],&num[1],&num[2],&num[3]);
    92         if(dfs(0))
    93             printf("Yes
    ");
    94         else
    95             printf("No
    ");
    96     }
    97     return 0;
    98 }
  • 相关阅读:
    经典滤波器设计
    算法学习专栏简介
    算法学习专栏简介
    压缩感知及实验分析
    压缩感知及实验分析
    《数学之美》之谈谈搜索引擎反作弊与权威性问题
    《数学之美》之谈谈搜索引擎反作弊与权威性问题
    查找searching
    查找searching
    《数学之美》之谈谈密码学
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/6904592.html
Copyright © 2020-2023  润新知