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数组重新排序一下,简单了很多

  • 相关阅读:
    [转]windows7远程桌面连接失败:发生身份验证错误。要求的函数不受支持
    SNMP协议学习笔记
    Sublime for MacOS 使用技巧
    Git常用操作
    罗技K380连接Win10(MacBookPro双系统)系统失败
    Git知识点汇总
    开发工作中提高效率的一些方式
    css
    IO多路复用
    进程
  • 原文地址:https://www.cnblogs.com/zhko11993/p/3794021.html
Copyright © 2011-2022 走看看