博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cdoj 1252 24点游戏 dfs
阅读量:7209 次
发布时间:2019-06-29

本文共 1171 字,大约阅读时间需要 3 分钟。

24点游戏

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

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

Description

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

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

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

Input

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

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

Output

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

Sample Input

23 3 8 81 1 1 1

Sample Output

yesno

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 
#include
#include
#include
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
>T; while(T--){ cin>>a[0]>>a[1]>>a[2]>>a[3]; if(fun(4))cout<<"yes\n"; else cout<<"no\n"; } return 0;}

 

转载地址:http://wqrum.baihongyu.com/

你可能感兴趣的文章
《Linux内核设计与实现》读书笔记(十九)- 可移植性
查看>>
都是假期惹的祸,该如何安慰自己?
查看>>
从零开始学JavaScript二(基本概念)
查看>>
Android AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
查看>>
js中的var
查看>>
年终知识分享——移动应用开发
查看>>
Centos 5.5 安装Mysql5.5过程
查看>>
网络爬虫基本原理(二)
查看>>
AndroidUI组件之ListView小技巧
查看>>
使用ThinkPHP框架高速开发站点(多图)
查看>>
解决iframe缓存
查看>>
mysql事物
查看>>
微软开源代码
查看>>
ssh 实体关系分析确立(ER图-实体关系图)
查看>>
shell语法简单介绍
查看>>
iOS捕获异常,常用的异常处理方法
查看>>
Struts2(九)OGNL标签一与Struts2标签
查看>>
双网卡绑定-bond0
查看>>
利用扩展事件进行调优和Troubleshooting PPT分享
查看>>
finger-guessing game:1场景搭建
查看>>