OpenJudge 2787 算24(dfs)
2017-07-25 00:02
453 查看
Description
给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。
这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。
比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。
Input
输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。
Output
对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。
Sample Input
5 5 5 1
1 1 4 2
0 0 0 0
Sample Output
YES
NO
Solution
不考虑运算顺序所以直接暴搜,每次选两个数进行运算,运算有六种,因为减法和除法都有顺序分两种
Code
给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。
这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。
比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。
Input
输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0,表示输入的结束,这组数据不用处理。
Output
对于每一组测试数据,输出一行,如果可以得到24,输出“YES”;否则,输出“NO”。
Sample Input
5 5 5 1
1 1 4 2
0 0 0 0
Sample Output
YES
NO
Solution
不考虑运算顺序所以直接暴搜,每次选两个数进行运算,运算有六种,因为减法和除法都有顺序分两种
Code
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<ctime> using namespace std; typedef long long ll; #define INF 0x3f3f3f3f #define maxn 5 #define eps 1e-8 double a[maxn]; int flag,vis[maxn]; int sign(double x) { if(fabs(x)<eps)return 0; if(x>eps)return 1; return -1; } void dfs(int num)//num表示当前正在进行第几步操作 { if(flag)return ; if(num==4) { for(int i=1;i<=4;i++) if(!vis[i]&&sign(a[i]-24.0)==0)flag=1; return ; } //选两个数a[i],a[j]进行操作,结果放到a[i]中 for(int i=1;i<=4;i++) if(!vis[i]) for(int j=i+1;j<=4;j++) if(!vis[j]) { vis[j]=1; double x=a[i],y=a[j]; if(sign(y))a[i]=x/y,dfs(num+1); if(sign(x))a[i]=y/x,dfs(num+1); a[i]=x-y,dfs(num+1); a[i]=y-x,dfs(num+1); a[i]=x+y,dfs(num+1); a[i]=x*y,dfs(num+1); a[i]=x,vis[j]=0; } } int main() { while(1) { for(int i=1;i<=4;i++)scanf("%lf",&a[i]); if(sign(a[1]+a[2]+a[3]+a[4])==0)break; flag=0; memset(vis,0,sizeof(vis)); dfs(1); printf("%s\n",flag?"YES":"NO"); } return 0; }
相关文章推荐
- OpenJudge 2787 算24
- OpenJudge 百练 2787 算24
- OpenJ_Bailian - 2787 算24 【思维 + dfs】
- [OpenJudge-NOI]算24 Dfs
- 08-24 HDU2601求因数 HDU2604二分矩阵递归 USACO4.1.4D边构图DFS求环
- nyoj 24 Point game 43 (dfs) 好题
- 百练2787:算24(递归)
- OpenJudge- 1789:算24
- Nyoj 24 Point game dfs
- 【OpenJudge 4124】海贼王之伟大航路(DP DFS)
- OpenJudge百炼-2787-算24-C语言-枚举
- Openjudge 6048泰国佛塔(dfs)
- 【OpenJudge 1789】算24(枚举)
- 【正解】Openjudge 至少有多少只恼人的大青蛙 (dfs 剪枝 好题)
- nyoj 43 24 Point game 【经典DFS】
- OpenJudge-Mooc 323:棋盘问题(dfs)
- NYOJ-43 24 Point game-DFS
- OpenJudge-Mooc 2:A Knight's Journey(dfs)
- Curling 2.0_dfs_2018_2_24
- Openjudge---算24