hihocoder-1304 搜索一·24点

  • 题意:给出四个数检验是否凑成24 即可。
  • 思路:补充两种运算  a ⑤ b = b / a  a ⑥ b = b - a 之后发现四个数进行所有运算无非就两种。
  • (((a ⊙ b) ⊙ c ) ⊙ d)
    ((a ⊙ b) ⊙ (c ⊙ d))
  • 枚举四个数的位置。枚举这六种运算符即可,会有重复 总复杂度不高无需剪枝 
  • #include<bits/stdc++.h>
    using namespace std;
    int t;
    double a[5],data[5];
    bool vis[10],flag;
    double cal(double a,double b,int c)
    {
        double ret;
        if(c==1)
            ret=b+a;
        else if(c==2)
            ret=a-b;
        else if(c==3)
            ret=a*b;
        else if(c==4&&b)
            ret=a/b;
        else if(c==5)
            ret=b-a;
        else if(c==6&&a)
            ret=b/a;
        return ret;
    }
    void get()
    {
        for(int i=1; i<=6; i++)
            for(int j=1; j<=6; j++)
                for(int k=1; k<=6; k++)
                {
                    if(cal(cal(data[1],data[2],i),cal(data[3],data[4],j),k)==24)
                    {
                        flag=1;
                        return;
                    }
                    if(cal(cal(cal(data[1],data[2],i),data[3],j),data[4],k)==24)
                    {
                        flag=1;
                        return;
                    }
                }
    }
    void dfs(int deep)
    {
        if(flag)return;
        if(deep>4)
        {
            get();
            return;
        }
        for(int i=1; i<=4; i++)
            if(vis[i]==0)
            {
                data[deep]=a[i];
                vis[i]=1;
                dfs(deep+1);
                vis[i]=0;
            }
    }
    int main()
    {
        scanf("%d",&t);
        while(t--)
        {
            flag=0;
            memset(vis,0,sizeof(vis));
            for(int i=1; i<=4; i++)
                scanf("%lf",&a[i]);
            dfs(1);
            if(flag)printf("Yes\n");
            else printf("No\n");
        }
        return 0;
    }
    

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/85199549