zoukankan      html  css  js  c++  java
  • Problem A: 速算24点

    Description

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

    Input

    输入数据占一行,给定四张牌。

    Output

    如果有解则输出"Y",无解则输出"N"。

    Sample Input

    A 2 3 6

    Sample Output

    Y

    HINT

     核心算法
    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);
    }

    	qsort(num,4,sizeof(num[0]),cmp);
    	flag=0;
    	do
    	{
    		dfs(num[0],num[1],1);
    	}while(next_permutation(num,num+4)&&!flag);
    

    dfs(a,b,m)代表着要将a和b作为两个数字,递归做算法。至于m那是标记在四张牌里一共用到了几张牌,用了三牌,就可以摊牌看结果了

    next_permutation(num,num+4)这个有点屌,直接就是将num数组重新排序一下,简单了很多

  • 相关阅读:
    SqlBulkCopy实现大容量数据快速插入数据库中
    防查询语句注入漏洞攻击
    wpf中数据绑定(Datacontext)的应用
    WPF中StackPanel的使用方法
    可空类型的使用《二》
    关于可空数据类型的介绍
    C# 之泛型详解
    C# 之String以及浅拷贝与深拷贝
    C# 小软件部分(二)
    MVC 之HTML辅助方法
  • 原文地址:https://www.cnblogs.com/zhko11993/p/3794021.html
Copyright © 2011-2022 走看看