速算24点问题

问题: 速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。

回答: 

    #include<iostream>  
    #include<cstdio>  
    #include<cstring>  
    #include<cstdlib>  
    #include<algorithm>  
    using namespace std;  
    int flag;  
    int num[4];  
    int cmp(const void *a,const void *b)  
    {  
        return *(int *)a-*(int *)b;  
    }  
    void dfs(int sum,int cur,int m)  
    {  
        if(flag)  
        return;  
        if(m==3)  
        {  
            if(sum+cur==24||sum-cur==24||sum*cur==24)  
            flag=1;  
            if(cur!=0&&sum%cur==0&&sum/cur==24)  
            flag=1;  
            return;  
        }  
        dfs(sum+cur,num[m+1],m+1);  //先计算前一部分  
        dfs(sum-cur,num[m+1],m+1);  
        dfs(sum*cur,num[m+1],m+1);  
        if(cur!=0&&sum%cur==0)  
        dfs(sum/cur,num[m+1],m+1);  
        dfs(sum,cur+num[m+1],m+1);  //先计算后一部分,相当于加括号  
        dfs(sum,cur-num[m+1],m+1);  
        dfs(sum,cur*num[m+1],m+1);  
        if(num[m+1]!=0&&cur%num[m+1]==0)  
        dfs(sum,cur/num[m+1],m+1);  
    }  
    int main()  
    {  
        int i;  
        char str[5];  
        while(scanf("%s",str)!=EOF)  
        {  
            if(strlen(str)==2)  
            num[0]=10;  
            else  
            {  
                if(str[0]=='A')  
                num[0]=1;  
                else if(str[0]=='J')  
                num[0]=11;  
                else if(str[0]=='Q')  
                num[0]=12;  
                else if(str[0]=='K')  
                num[0]=13;  
                else  
                num[0]=str[0]-'0';  
            }  
            for(i=1;i<=3;i++)  
            {  
                scanf("%s",str);  
                if(strlen(str)==2)  
                num[i]=10;  
                else  
                {  
                   if(str[0]=='A')  
                   num[i]=1;  
                   else if(str[0]=='J')  
                   num[i]=11;  
                   else if(str[0]=='Q')  
                   num[i]=12;  
                   else if(str[0]=='K')  
                   num[i]=13;  
                   else  
                   num[i]=str[0]-'0';  
                }  
            }  
            qsort(num,4,sizeof(num[0]),cmp);  
            flag=0;  
            do  
            {  
                dfs(num[0],num[1],1);  
            }while(next_permutation(num,num+4)&&!flag);  
            if(flag)  
            printf("Yes\n");  
            else  
            printf("No\n");  
        }  
        return 0;  
    }  

 

转载于:https://www.cnblogs.com/benchao/p/4486469.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值