• 速算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 ");  
                else  
                printf("No ");  
            }  
            return 0;  
        }  

  • 相关阅读:
    ElementUI 组件不支持@keyup 的解决办法
    ElementUI 实现头部组件和左侧组件效果
    ElementUI 整体页面布局
    vue路由登录拦截
    vue中使用localStorage存储信息
    ElementUI Checkbox 多选框
    vue拦截器qs
    (未完)经典Web漏洞实战演练靶场笔记
    文件包含漏洞实战靶场笔记
    文件解析漏洞总结
  • 原文地址:https://www.cnblogs.com/benchao/p/4486469.html
Copyright © 2020-2023  润新知