zoukankan      html  css  js  c++  java
  • 速算游戏_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;
    }
    

    .....

  • 相关阅读:
    数据库性能优化一:数据库自身优化(大数据量)
    Delphi中initialization和finalization
    Delphi中的消息处理
    布施持戒忍辱精进禅定般若——净空法师【转】
    如何清除sql server日志
    工作反省
    软件设计入门2 数据库设计
    软件设计入门1 架构设计
    invokeRequired属性和 invoke()方法
    delphi 生成验证码
  • 原文地址:https://www.cnblogs.com/dai-jia-ye/p/9308879.html
Copyright © 2011-2022 走看看