Cdoj 24点游戏之解题报告
2015-12-23 22:45
375 查看
24点游戏
Time Limit: 20 SecMemory Limit: 256 MB
题目连接
http://acm.uestc.edu.cn/#/problem/show/1252Description
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
对于这题笔者是看了大牛的正解之后才知道该如何用DFS(深搜)来解决这个问题;
下面就贴出代码吧:
#include<iostream> #include<algorithm> #include<cmath> #include<cstdio> using namespace std; double value[4]; //对于此处的判断是否是24点,是实数而且考虑负数 bool DFS(int n) { if(n==1) { if(fabs(value[n-1]-24)<1e-6) return true; else return false; } else{ for(int i=0;i<n;++i) for(int j=i+1;j<n;++j) { double x1 = value[i]; double x2 = value[j]; value[j] = value[n-1]; //将后面的数提到前面来,以便于后面的计算 value[i] = x1+x2; if(DFS(n-1)) return true; value[i] = x1*x2; if(DFS(n-1)) return true; value[i] = x1-x2; if(DFS(n-1)) return true; value[i] = x2-x1; if(DFS(n-1)) return true; if(x1){ value[i] = x2/x1; if(DFS(n-1)) return true; } if(x2){ value[i] = x1/x2; if(DFS(n-1)) return true; } //对于数value[j]没有满足条件,所以还原原来的数 value[i] = x1; value[j] = x2; } } //若n为数都不满足的话,就返回false return false; } int main(void) { int T; cin>>T; while(T--) { cin>>value[0]>>value[1]>>value[2]>>value[3]; if(DFS(4)) cout<<"yes\n"; else cout<<"no\n"; } return 0; }
如果你还没搞清楚状况的话可以点击一下下面的传送门:
(づ ̄3 ̄)づ╭❤~亲点我一下吧!
路漫漫其修远兮,吾将hold下去!
8÷(3–8÷3)对
对于这
相关文章推荐
- 认识STM32的系统时钟
- iOS调节系统音量
- Hibernate 学习代码/笔记 (三)
- python初学―-实现excel里面读数据进行排序(改进算法)
- Nexus安装
- C++ 中类的访问级别控制(public,protected,private!~~~3p)
- 平时总结,清RadioGroup,代码无法格式化
- Java学习笔记(5):3.面向对象之方法详解
- Failed to find 'ANDROID_HOME' environment variable
- iOS开发多线程----简单介绍篇
- AMF序列化为对象和AMF序列化为二进制字节流
- 常见端口及说明
- 64位指针压缩指什么?
- vs2013中配置Qt的方法以及使用感受。
- Attribute is missing the Android namespace prefix
- win10 svn 图标不显示解决
- 总结
- 哈希算法MD5的实现
- html的相关基础元素(一)
- JSP将后台返回的数据显示并分页