CDOJ 24点游戏

本文介绍了CDOJ上的一道24点游戏编程题,要求判断给定的4个正整数是否能通过加减乘除括号构成24。文章提供了题目的链接、输入输出格式、样例以及解题思路,强调了除法可能涉及分数,并给出了优先深度搜索的解题方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目连接

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

题意

用尽4个数,可以出现分数,可以加括号,能否凑出24点

题解

优先深度搜索,要搜索所有的情况,x1-x2与x2-x1,x1/x2与x2/x1都是两种情况,x1*x2,x1+x2只有一种情况

代码

#include<bits/stdc++.h>
using namespace std;
#define max 1000
typedef pair<int,int>p;
#define INF  1e9+7
#define ll long long
#define eps 1e-6
queue<double> que;
int num[5];
//double tot=0;
bool dfs(int n){
    if (n==1)
    {   if (fabs(24-num[0])<eps)//精度足够小 就可以达到24的要求
        {
         return true;
        }
        else{
            return false;
        }  
    }
    for (int i = 0; i < n; ++i)
    {   int i1=num[i];
        int i2=num[i+1];
        for (int j = i+1; j <n ; ++j)
        {
            num[j]=num[n-1]; //减小搜索的数组大小

             num[i]=i1+i2;if(dfs(n-1))return 1;//更新num[i]作为此次搜索的新数据
             num[i]=i1*i2;if(dfs(n-1))return 1;
             num[i]=i1-i2;if(dfs(n-1))return 1;
             num[i]=i2-i1;if(dfs(n-1))return 1;
             if (i1)// i1不为0 0不能作为分母
             {
                 num[i]=i2/i1;if(dfs(n-1))return 1;
             }
             if (i2)
             {
                 num[i]=i1/i2;if(dfs(n-1))return 1;
             }
             num[i]=i1;// 此次num[i]搜索没有找到和为24,把num[i] num[j]的值还原,重新开始搜索
             num[j]=i2; //
        }
    }
 return 0;
}
int main(int argc, char const *argv[])
{
    int t;
    cin>>t;
    for (int i = 0; i < t; ++i)
    {
        cin>>num[0]>>num[1]>>num[2]>>num[3];
        if (dfs(4))
        {
            printf("yes\n");
        }
        else{
            printf("no\n");
        }
    }
    return 0;
}

Get

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值