速算游戏_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\n", mina);//输出
    return 0;
}

.....

posted @ 2018-07-14 11:05  DJY_01  阅读(249)  评论(0编辑  收藏  举报