• 速算游戏_NOI导刊2011提高(04)


    这道题会做到怀疑人生,好了废话不多说,我们发现这道题是一道深搜。但是字典序却不知道怎么排,我们发现没算一个运算符就会填加一个括号,所以我们用一个char变量贮储字典序最小的东西。

    代码:

    #include<cstring>
    #include<cstdio>
    typedef char String[20];
    int a[4],b[4], ans[4][2];
    String x[4],m,mina="zzzzz";
    char op[4],data[4];
    void print()
    {
        for(int i=0;i<4;i++)
        {
            sprintf(x[i],"%c",data[i]);//将原来数组记录一下
        }
        for(int i=0;i<3;i++)
        {
            sprintf(m,"(%s%c%s)",x[ans[i][0]],op[i],x[ans[i][1]]);//去找字典序最小的值
            strcpy(x[ans[i][0]],m);//复制粘贴
        }
        if(strcmp(mina,x[ans[2][0]])>0)
        {
            strcpy(mina,x[ans[2][0]]);//比较
        }
    }
    void dfs(int k)
    {
        if(k==3)
        {
            int i;
            for(i=0;i<4;i++)
                if(a[i]!= 0) break;//将a[i]数组的值存到a[3]里,方便判断
            if(i<4&&a[i]==24)
            {
                print();
            }
            return;
        }
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
            {
                if(i!=j&&a[j]!=0&&a[i]!=0)
                {
                    int t1,t2;
                    //加操作
                    t1=a[i],t2=a[j];
                    a[i]=a[i]+a[j];a[j]=0;
                    ans[k][0]=i,ans[k][1]=j;//记录本次的加数
                    op[k]='+';//记录符号
                    dfs(k+1);//再搜一遍
                    a[i]=t1,a[j]=t2;
                    //减操作
                    t1=a[i];
                    t2=a[j];
                    a[i]=a[i]-a[j];
                    a[j]=0;
                    ans[k][0]=i;
                    ans[k][1]=j;
                    op[k]='-';//记录
                    dfs(k+1);
                    a[i]=t1;
                    a[j]=t2;
                    //乘
                    t1=a[i];
                    t2=a[j];
                    a[i]=a[i]*a[j];
                    a[j]=0;
                    ans[k][0]=i;
                    ans[k][1]=j;
                    op[k]='*';
                    dfs(k+1);
                    a[i]=t1;
                    a[j]=t2;
                    //判断会不会出现小数            
                    if(a[i]%a[j]==0)
                    {
                        t1=a[i];
                        t2=a[j];
                        a[i]=a[i]/a[j];
                        a[j]=0;
                        ans[k][0]=i;
                        ans[k][1]=j;
                        op[k]='/';
                        dfs(k+1);
                        a[i]=t1;
                        a[j]=t2;
                    }
                }
            }
        }
    }
    int main()
    {
        char hh;
        memset(ans,-1,sizeof(ans));
        for(int i=0;i<4;i++)
        {
            scanf("%c ", &hh);//我以为会出现A,T,J,Q,K。
            data[i]=hh;
            if(hh=='A') a[i]=1;
            else if(hh=='T') a[i]=10;
            else if(hh=='J') a[i]=11;
            else if(hh=='Q') a[i]=12;
            else if(hh=='K') a[i]=13;
            else
            {
                a[i]=hh-'0';
            }
        }
        memcpy(b,a,sizeof(a));//其实可以删掉。
        dfs(0);//搜素
        printf("%s
    ", mina);//输出
        return 0;
    }
    

    .....

  • 相关阅读:
    HDOJ 4747 Mex
    HDU 1203 I NEED A OFFER!
    HDU 2616 Kill the monster
    HDU 3496 Watch The Movie
    Codeforces 347A A. Difference Row
    Codeforces 347B B. Fixed Points
    Codeforces 372B B. Hungry Sequence
    HDU 1476 Sudoku Killer
    HDU 1987 How many ways
    HDU 2564 词组缩写
  • 原文地址:https://www.cnblogs.com/dai-jia-ye/p/9308879.html
Copyright © 2020-2023  润新知