速算游戏_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;
}

.....

转载于:https://www.cnblogs.com/dai-jia-ye/p/9308879.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值