cdoj 1252 24点游戏 dfs

 2023-09-13 阅读 16 评论 0

摘要:24点游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1252 Description 游戏24点?24点就是给你一串数字,问你是否通过加减乘除括号构成24点。 沈爷觉得这个很好玩,就决定考考你,给你4个数,可以交

24点游戏

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

http://acm.uestc.edu.cn/#/problem/show/1252

Description

游戏24点?24点就是给你一串数字,问你是否通过加减乘除括号构成24点。

沈爷觉得这个很好玩,就决定考考你,给你4个数,可以交换位置,可以用加减乘除和括号,是否能构成24点呢?

注意哦~这里的除法并不是整数除法,比如样例

Input

第一行T,表示有多少组测试数据,1T50

接下来T行,每行4个正整数a1a2a3a4,表示每个数都是多少,1ai13

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;
}

 

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/55618.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息