1. 程式人生 > >hihocoder-1304 搜尋一·24點

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;
    }