NOI 1789:算24

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41033913/article/details/80044170

第一次见到这道题目的时候是大一上学期期末考试,那时候只是听过什么搜索什么的,具体没怎么用过,今天恰好看到这道题目,虽然还是没学算法,但是还是能够用自己的方法理解的。

具体的思想就是:四个数中随机取两个数进行各种运算并保存,(+   -   *   /)

                            再从三个数中随机取两个数进行各种运算并保存,

                            再最后两个数进行各种运算,保存最终的结果,

                            然后进行判断是否是24就可以的;

超级暴力有没有,然后再自己看代码吧。

#include<bits/stdc++.h>
using namespace std;
bool Op(double a[],int n)
{
    double Next[5];//用来保存下一次运算数据
    if(n==1&&abs(a[0]-24)<0.00001)
                //因为是实数,所以不能直接进行判断
        return true;
    if(n==1)
        return false;
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            int t=1;
            for(int k=0;k<n;k++){
                if(k!=i&&k!=j)
                    Next[t++]=a[k];//保存没有进行运算的数字
                }
    //各种运算都进行一次来搜索,保存在第一个里面,方便判断
            Next[0]=a[i]+a[j];
            if(Op(Next,n-1))return true;
            Next[0]=a[i]-a[j];
            if(Op(Next,n-1))return true;
            Next[0]=a[j]-a[i];
            if(Op(Next,n-1))return true;
            Next[0]=a[i]*a[j];
            if(Op(Next,n-1))return true;
            Next[0]=a[i]/a[j];
            if(Op(Next,n-1))return true;
            Next[0]=a[j]/a[i];
            if(Op(Next,n-1))return true;
        }
    }
    return false;
}
int main()
{
    while(1){
        double a[5];
        int sum=0;
        for(int i=0;i<4;i++){
            cin>>a[i];
            sum+=a[i];
        }
        if(sum==0)
            break;
        if(Op(a,4))
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
    return 0;
}

其实事情只是看上去难,不要被自己吓到!总有解决思路和解决方法的,希望不要放弃!!!

猜你喜欢

转载自blog.csdn.net/qq_41033913/article/details/80044170
今日推荐