nyoj 43 24 Point game 【dfs&&递归】

来源:互联网 发布:linux入门教程 推荐 编辑:程序博客网 时间:2024/05/21 14:41

24 Point game

时间限制:3000 ms  |  内存限制:65535 KB
难度:5
描述

There is a game which is called 24 Point game.

In this game , you will be given some numbers. Your task is to find an expression which have all the given numbers and the value of the expression should be 24 .The expression mustn't have any other operator except plus,minus,multiply,divide and the brackets. 

e.g. If the numbers you are given is "3 3 8 8", you can give "8/(3-8/3)" as an answer. All the numbers should be used and the bracktes can be nested. 

Your task in this problem is only to judge whether the given numbers can be used to find a expression whose value is the given number。

输入
The input has multicases and each case contains one line
The first line of the input is an non-negative integer C(C<=100),which indicates the number of the cases.
Each line has some integers,the first integer M(0<=M<=5) is the total number of the given numbers to consist the expression,the second integers N(0<=N<=100) is the number which the value of the expression should be.
Then,the followed M integer is the given numbers. All the given numbers is non-negative and less than 100
输出
For each test-cases,output "Yes" if there is an expression which fit all the demands,otherwise output "No" instead.
样例输入
24 24 3 3 8 83 24 8 3 3
样例输出
YesNo
来源
经典改编
上传者
张云聪
分析:
这道题是一个不错的题,运用深搜加递归,佷6666666666.就是把每一种可能暴力枚举出来 如果能算出24则返回1.
代码:
#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>#define e 1e-6using namespace std;double num[7],v;int n;int dfs(int t){if(t==n){if(fabs(v-num[n])<e)return 1;return 0;}double left,right;for(int i=t;i<n;i++) for(int j=i+1;j<=n;j++)   {   left=num[i];   right=num[j];   num[i]=num[t];   num[j]=left+right;   if(dfs(t+1))   return 1;   num[j]=left-right;   if(dfs(t+1))   return 1;   num[j]=left*right;   if(dfs(t+1))   return 1;   num[j]=right-left;   if(dfs(t+1))   return true;   if(left)   num[j]=right/left;if(dfs(t+1))   return 1;   if(right)   num[j]=left/right;   if(dfs(t+1))   return 1;   num[i]=left;   num[j]=right;   }   return 0;}int main(){int T;scanf("%d",&T);while(T--){scanf("%d%lf",&n,&v);for(int i=1;i<=n;i++)scanf("%lf",&num[i]);if(dfs(1))printf("Yes\n");elseprintf("No\n"); }return 0;} 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 荣耀10天气删了怎么办 荣耀7i手机卡顿怎么办 荣耀v9总是自己拨号怎么办 华为荣耀5x很卡怎么办 华为荣耀6plus卡怎么办 华为手机触屏不灵敏怎么办 华为荣耀6x太卡怎么办 华为荣耀7太卡怎么办 荣耀手机开不开机怎么办 华为g750手机开不了机怎么办 华为手机开不了机怎么办 小米手机刷机后激活不了帐号怎么办 魅蓝note5卡顿怎么办 魅蓝note5卡了怎么办 魅蓝note5很卡怎么办 魅蓝note5锁了怎么办 荣耀9开不开机怎么办 4s更新后用不了怎么办 魅蓝3开不了机怎么办 手机不支持联通4g网络怎么办 华为手机出现emui界面怎么办 华为畅玩4x内存不足怎么办 手机电源键掉了怎么办 手机电源键坏了怎么办 小米5s听筒声音小怎么办 荣耀8电源键失灵怎么办 华为荣耀3c卡怎么办 大王卡是2g网络怎么办 联通停用2g副卡怎么办 华为荣耀8忘记解锁密码怎么办 华为手机内存满了怎么办 华为手机无限重启怎么办 华为3c重启怎么办 荣耀6 无限重启怎么办 手机进水无法开机了怎么办 华为手机不停重启怎么办 华为手机反复重启怎么办 酷派电池不耐用怎么办 美图手机充电慢怎么办 酷派b770太卡怎么办 酷派手机出现无命令怎么办