码迷,mamicode.com
首页 > 其他好文 > 详细

速算24点问题

时间:2015-05-08 01:36:28      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

问题: 速算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;  
    }  

 

速算24点问题

标签:

原文地址:http://www.cnblogs.com/benchao/p/4486469.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!