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个正整数a1, a2, a3, a4,表示每个数都是多少,1≤ai≤13

Output

对于每一次询问,如果能够凑成24点,输出yes,否则输出no

Sample Input

2
3 3 8 8
1 1 1 1

Sample Output

yes
no

HINT

题意

题解:

1.递归处理,深度优先搜索

dfs(int n) 表示我现在还剩下多少个数,没有处理

由于有括号的原因,我们每次就直接暴力枚举n个数中的两个数,然后进行加减乘除就好了,然后将这两个数变成新的一个数,然后dfs(n-1)就好了,这样不停的递归下去。

关于有理数除法的问题,我们有2种方法可以解决

(1)自己手写一个分数的类(比较麻烦),然后进行分数的加减乘除去解决这一道题

(2)由于只有4个数,而且每个数最大才13,所以我们直接全部用小数去处理就好了,最后的答案能够得到24的话,那么最后我们剩下的那个小数x,必定满足fabs(x-24)<Y,其中Y是一个接近于0的数。在本题,eps 只要小于0.01就能过

2.直接暴力写出所有情况即可

a[1]+a[2]+a[3]+a[4]

a[1]+a[2]+a[3]*a[4]

......

一直写下去就好

大概应该只有600多个

代码:

#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
double a[5];
bool fun(int n){
    if(n==1){
        if(fabs(a[0]-24)<1e-6)return true;
        else return false;
    }
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            double x1=a[i];
            double x2=a[j];
            a[j]=a[n-1];
            a[i]=x1+x2;if(fun(n-1))return true;
            a[i]=x1*x2;if(fun(n-1))return true;
            a[i]=x1-x2;if(fun(n-1))return true;
            a[i]=x2-x1;if(fun(n-1))return true;
            if(x2){a[i]=x1/x2;if(fun(n-1))return true;}
            if(x1){a[i]=x2/x1;if(fun(n-1))return true;}
            a[i]=x1;
            a[j]=x2;
        }
    }
    return false;
}

int main()
{

    int T;
    cin>>T;
    while(T--){
        cin>>a[0]>>a[1]>>a[2]>>a[3];
        if(fun(4))cout<<"yes\n";
        else cout<<"no\n";
    }
    return 0;
}
时间: 2024-08-06 12:29:43

cdoj 1252 24点游戏 dfs的相关文章

hdu1427 24点游戏 (DFS)ps:AC了最开心的一道题

速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3755    Accepted Submission(s): 923 Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','

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

[华为机试练习题]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点游戏计算器 (简单四则运算)(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者剩. 二.设计思路: 由于设计到了表达式,很自然的想到了是否可以使用表达式树来设计程序.本程序的确使用了表达式树,也是程序最关键的环节.简要概括为:先列出所有表达式的可能性,然后运用表达式树计算表达式的值.程序中大量的运用了递归,各个递归式不是很复杂,