bzoj1215 24点游戏

Description

为了培养小孩的计算能力,大人们经常给小孩玩这样的游戏:从1付扑克牌中任意抽出4张扑克,要小孩用“+”、“-”、“×”、“÷”和括号组成一个合法的表达式,并使表达式的值为24点。这种游戏就是所谓的“24点游戏”。请你编程求出对于给出的任意4个正整数a、b、c、d,请你编程求出这4个整数能组成多少个值为24的不同表达式。

Input

输入共一行,为4个正整数a、b、c、d (0<=a,b,c,d<=100)

Output

输出由a、b、c、d组成的值为24表达式个数,如没有,输出0。

两个不加多余括号的表达式相同当且仅当仅当完全相同或通过结合律可以互相转换

枚举可能的表达式,最多7680个,且要求表达式树中+或*的右子节点不为同优先级运算符

#include<cstdio>
#include<cmath>
#include<algorithm>
#define _0 0.000001
int v[4],rnk[4];
int hs[8000],p=0,ans=0;
inline void add(int v1,int v2,int v3,int v4,int v5,int v6,int v7){
    hs[p++]=(v1|v2<<3|v3<<6|v4<<9|v5<<12|v6<<15|v7<<18);
}
inline double f(double a,double b,int op){
    if(op==0)return a+b;
    if(op==1)return a-b;
    if(op==2)return a*b;
    return a/b;
}
inline bool e(int a,int b){
    if(a==0)return b>1;
    if(a==2)return b<2;
    return 1;
}
inline void chk(int v1,int v2,int v3,int v4){
    for(int o1=0;o1<4;o1++){
        for(int o2=0;o2<4;o2++){
            for(int o3=0;o3<4;o3++){
                bool e1=e(o3,o2),e2=e(o2,o1);
                if(fabs(f(f(f(v[v1],v[v2],o1),v[v3],o2),v[v4],o3)-24)<_0)add(rnk[v1],rnk[v2],o1+4,rnk[v3],o2+4,rnk[v4],o3+4);
                if(e1&&fabs(f(f(v[v1],v[v2],o1),f(v[v3],v[v4],o2),o3)-24)<_0)add(rnk[v1],rnk[v2],o1+4,rnk[v3],rnk[v4],o2+4,o3+4);
                if(e2&&fabs(f(f(v[v1],f(v[v2],v[v3],o1),o2),v[v4],o3)-24)<_0)add(rnk[v1],rnk[v2],rnk[v3],o1+4,o2+4,rnk[v4],o3+4);
                if(e1&&fabs(f(v[v1],f(f(v[v2],v[v3],o1),v[v4],o2),o3)-24)<_0)add(rnk[v1],rnk[v2],rnk[v3],o1+4,rnk[v4],o2+4,o3+4);
                if(e1&&e2&&fabs(f(v[v1],f(v[v2],f(v[v3],v[v4],o1),o2),o3)-24)<_0)add(rnk[v1],rnk[v2],rnk[v3],rnk[v4],o1+4,o2+4,o3+4);
            }
        }
    }
}
int main(){
    for(int i=0;i<4;i++)scanf("%d",v+i);
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++)
            if(i!=j)rnk[i]+=v[i]<v[j];
    }
    chk(0,1,2,3);
    chk(0,1,3,2);
    chk(0,2,1,3);
    chk(0,2,3,1);
    chk(0,3,1,2);
    chk(0,3,2,1);
    chk(1,0,2,3);
    chk(1,0,3,2);
    chk(1,2,0,3);
    chk(1,2,3,0);
    chk(1,3,0,2);
    chk(1,3,2,0);
    chk(2,0,1,3);
    chk(2,0,3,1);
    chk(2,1,0,3);
    chk(2,1,3,0);
    chk(2,3,0,1);
    chk(2,3,1,0);
    chk(3,0,1,2);
    chk(3,0,2,1);
    chk(3,1,0,2);
    chk(3,1,2,0);
    chk(3,2,0,1);
    chk(3,2,1,0);
    std::sort(hs,hs+p);
    if(p)ans=1;
    for(int i=1;i<p;i++)ans+=(hs[i]!=hs[i-1]);
    printf("%d",ans);
    return 0;
}
时间: 2024-12-10 14:25:10

bzoj1215 24点游戏的相关文章

[华为机试练习题]44.24点游戏算法

题目 注意: 6 + 2 * 4 + 10 = 24 不是一个数字一个数字的计算 代码 /*--------------------------------------- * 日期:2015-07-03 * 作者:SJF0115 * 题目:24点游戏算法 * 来源:华为机试练习题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector&

24点游戏

题目描述 给出4个正整数操作数,你的任务是使用运算符(+,-,*,/)和括号对操作数进行计算,分析是否能得到24,每个操作数只能使用1次,运算符和括号可以多次使用,注意所有的中间结果都是整数. 输入 输入包括多行,每行4个正整数,范围是[1,13],输入以0 0 0 0标记结束 输出 若输入的4个操作数能计算出24,输出Yes,否则输出No 样例输入 1 1 1 1 2 5 7 8 0 0 0 0 样例输出 No Yes #include<iostream>   #include<str

微信公众平台开发—24点游戏

一.源码 package org.xs.dntown.wx.game24.modules.web; import java.text.NumberFormat; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Random; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager

24点游戏(dfs)

24点游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 2424点就是给你一串数字,问你是否通过加减乘除括号构成2424点. 沈爷觉得这个很好玩,就决定考考你,给你44个数,可以交换位置,可以用加减乘除和括号,是否能构成2424点呢? 注意哦~这里的除法并不是整数除法,比如样例 Input 第一行TT,表示有多少组测试数据,1≤T≤501≤T≤5

cdoj 1252 24点游戏 dfs

24点游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1252 Description 24点就是给你一串数字,问你是否通过加减乘除括号构成24点. 沈爷觉得这个很好玩,就决定考考你,给你4个数,可以交换位置,可以用加减乘除和括号,是否能构成24点呢? 注意哦~这里的除法并不是整数除法,比如样例 Input 第一行T,表示有多少组测试数据,1≤T≤50 接下来T行,每行4

24点游戏计算器 (简单四则运算)(c++)

24点游戏计算器 (简单四则运算)(c++):https://github.com/liuxinig/cpp_1001/blob/master/24dian_siZeIN.txt 1 //24点统计 2 3 #include <iostream> 4 #include <cmath> 5 using namespace std; 6 #define N 14 7 //a数组存四个数字 8 int cixu[3],fuHao[3],p[N],sum = 0; 9 float a0[4

24点游戏计算器 (加、减、乘、除、阶乘、导数)(c++)

24点游戏计算器 (加.减.乘.除.阶乘.导数)(c++):https://github.com/liuxinig/cpp_1001/blob/master/24dian_fuZaIN.txt 1 //24点统计 2 3 #include <iostream> 4 #include <cmath> 5 using namespace std; 6 #define N 14 7 //a数组存四个数字 8 int cixu[3],fuHao[3],p[N],sum = 0; 9 flo

编程之美-1.16 24点游戏

一.问题描述 给玩家4张牌,每张牌牌面值在1~13之间,允许其中有数值相同的牌.采用加.减.乘.除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能使用一次,尝试构造一种表达式,使其运算结果为24. 如 输入:3 3 7 7 输出:(((3)/(7))+(3))*(7) 二.程序实现原理 遍历所有可能的组合,直到找到一个符合条件的组合或者遍历所有情况没有找到满足的组合,具体详见代码注释 三.程序基本实现 #include<iostream> #include<string&g

经典趣味24点游戏程序设计(python)

一.游戏玩法介绍: 24点游戏是儿时玩的主要益智类游戏之一,玩法为:从一副扑克中抽取4张牌,对4张牌使用加减乘除中的任何方法,使计算结果为24.例如,2,3,4,6,通过( ( ( 4 + 6 ) - 2 ) * 3 )  = 24,最快算出24者剩. 二.设计思路: 由于设计到了表达式,很自然的想到了是否可以使用表达式树来设计程序.本程序的确使用了表达式树,也是程序最关键的环节.简要概括为:先列出所有表达式的可能性,然后运用表达式树计算表达式的值.程序中大量的运用了递归,各个递归式不是很复杂,