zoukankan      html  css  js  c++  java
  • openjudge 1789算24 解析报告

    1789:算24的 解析报告
    总时间限制: 3000ms 内存限制: 65536kB
    描述
    给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。

    这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。

    比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。
    输入
    输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。
    输出
    对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。
    样例输入
    5 5 5 1
    1 1 4 2
    0 0 0 0
    样例输出
    YES
    NO

    这是一道DFS的搜索题。其实这个题。状态特别好想。但是实现起来非常困难。其中实现的时候。还有很多坑。所以在实现的时候,真的得注意。
    首先。发现这道题的一个关键。这道题的数字。是可以调整位置的。而我们的思路就可以已简单化一点。两两组合。组合之后。继续存在原数组,不过被组合的要打上标记,不允许再访问。等组合了3次之后,就可以访问最后的那个数组,是不是24,一目了然。这道题就只是求能不能实现,所以工作量一下就减小了许多。 注意:在组合的时候有4种运算。但是。在实现的时候要进行6次判断。减法和除法,有被减数和减数之分。这个地方是个坑,得多加注意。
    贴出代码:

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cmath>
     4 #include<string.h>
     5 using namespace std;
     6 int visit[5];
     7 double a[5];
     8 int dfs(int step)
     9 {
    10     if(step==4){
    11     for(int i=1;i<=4;i++)
    12         if(!visit[i]){
    13         if(fabs(a[i]-24.0)<0.0000001){
    14             return 1;
    15         }
    16         }
    17     return 0;
    18     }
    19     for(int i=1;i<=4;i++) //枚举第一个数
    20     if(!visit[i])
    21     for(int j=i+1;j<=4;j++)//枚举第二个数
    22        if(!visit[j])
    23        {
    24            visit[j]=1;
    25            double tmp1=a[i],tmp2=a[j];
    26            a[i]=tmp1+tmp2;
    27            if(dfs(step+1))return 1;
    28            a[i]=tmp1-tmp2;
    29            if(dfs(step+1))return 1;
    30            a[i]=tmp2-tmp1;
    31            if(dfs(step+1))return 1;
    32            a[i]=tmp1*tmp2;
    33            if(dfs(step+1))return 1;
    34            a[i]=tmp2/tmp1;
    35            if(dfs(step+1))return 1;
    36            a[i]=tmp1/tmp2;
    37            if(dfs(step+1))return 1;
    38            a[i]=tmp1;//回溯法
    39            visit[j]=0;
    40        }
    41     return 0;
    42 }
    43 int main()
    44 {
    45    while(1)
    46    {
    47        scanf("%lf%lf%lf%lf",&a[1],&a[2],&a[3],&a[4]);
    48        if(a[1]||a[2]||a[3]||a[4]){
    49        memset(visit,0,sizeof(visit));
    50        if(dfs(1))printf("YES
    ");
    51        else printf("NO
    ");
    52        }
    53        else break;
    54    }
    55    return 0;
    56 
    57 }
  • 相关阅读:
    【LeetCode】241. Different Ways to Add Parentheses
    【LeetCode】240. Search a 2D Matrix II
    【LeetCode】239. Sliding Window Maximum
    【LeetCode】238. Product of Array Except Self
    【LeetCode】237. Delete Node in a Linked List
    【Babble】批量学习与增量学习、稳定性与可塑性矛盾的乱想
    【LeetCode】233. Number of Digit One
    【LeetCode】236. Lowest Common Ancestor of a Binary Tree
    MySQL存储过程
    mysql远程连接/访问速度慢的解决方案
  • 原文地址:https://www.cnblogs.com/uncle-lu/p/5895857.html
Copyright © 2011-2022 走看看