zoukankan      html  css  js  c++  java
  • 算24

    算24

    题目描述

    描述

    给出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

     

    代码

    #include<cstdio>#include<cmath>#include<cstring>#include<iostream>#include<cstdlib>

    using namespace std;

    double a[5];bool flag=false;

    void dfs(double b[],int k){

         if(flag)return ;

         if(k==1){

                  if(fabs(b[1]-24)<1e-4)flag=true;//解是否正确

                  }

                  else for(int i=1;i<=k;i++)

                  for(int j=1;j<=k;j++)

                  if(i!=j){

                           double bb[5];int js=0;

                           //bb用来存储新状态

                           //先将没选中的数存入bb

                           for(int p=1;p<=k;p++)

                           if(p!=i&&p!=j)bb[++js]=b[p];

                           double op=1e10;//用来存放计算结果

                           for(int cf=1;cf<=4;cf++)

                           switch(cf){

                           case 1:op=b[i]+b[j];

                                      bb[++js]=op;//将计算结果存入bb

                                      dfs(bb,js);

                                      js--;

                                      break;

                                      case 2:op=b[i]-b[j];

                                      bb[++js]=op;

                                      dfs(bb,js);

                                      js--;

                                      break;

                                      case 3:op=b[i]*b[j];

                                      bb[++js]=op;

                                      dfs(bb,js);

                                      js--;

                                      break;

                                      case 4:if(b[j]!=0){op=b[i]/b[j];

                                      bb[++js]=op;

                                      dfs(bb,js);

                                      js--;}

                                      break;

                                      }

                           }

         }

     

         int main(){

         while(1){

                flag=false;

                  for(int i=1;i<=4;i++)

                  cin>>a[i];

                  if(a[1]==0)break;//是否读完

                  dfs(a,4);

                  if(flag)cout<<"YES"<<endl;

                  else cout<<"NO"<<endl;

                  }

                  return 0;

         }

    分析

    这题的状态是k个数;

    当在只有一个数时那便是问题有解了;所有出口为一个数;

    可能的路径:以四变三为例+,*有十二种,/,-有二十四种,总共会有三十六种;

    但其中会有可行性判断:除法是除数为0时便不可以;

    不过在其中要维护状态那便用a数组和k;

    不过为了省时间可以在有正确解(如果le-4)时出去;

    没有时用bb存储没有选到的数,然后用switch列举可能的四种运算;

    注意:要用double 来存储因为如题目上讲的会有分数;

     

    算法:穷举算法;

  • 相关阅读:
    Spring框架学习09——基于AspectJ的AOP开发
    Spring框架学习08——自动代理方式实现AOP
    Spring框架学习07——基于传统代理类的AOP实现
    Spring框架学习06——AOP底层实现原理
    Spring框架学习05——AOP相关术语详解
    SpringMVC框架09——@ResponseBody的用法详解
    Spring框架学习04——复杂类型的属性注入
    Spring框架学习03——Spring Bean 的详解
    Spring框架学习01——使用IDEA开发Spring程序
    sqlserver 迁移
  • 原文地址:https://www.cnblogs.com/shenlaizhibi/p/5861240.html
Copyright © 2011-2022 走看看