奇妙的23点(OJ--3297
来源:互联网 发布:淘宝1111和1212 编辑:程序博客网 时间:2024/05/01 04:12
题目描述
题意很简单,给出5个数字,你可以使用 ‘ + ’ , ‘ - ’ , ‘ * ’运算符(运算符没有优先级关系),使得最后计算的结果等于
23,其中给出的5个数字可以任意改变顺序。
输入
输入5个数字,每个数字的大小范围为[1,50]。
输出
如果最后的运算结果可以等于23,输出Yes,不能的话输出No。
思路:用深搜对这五个数进行三种运算。
示例输入
1 1 1 1 1
1 2 3 4 5
2 3 5 7 11
示例输出
No
Yes
Yes
<span style="font-weight: normal;"><span style="font-size:18px;">#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#include <queue>#define esp 1e-12using namespace std;int s[10];bool vis[10],flag;int ans;int cal(int a,int b,int j) //分别进行三种运算{ if(j==0) return a+b; else if(j==1) return a-b; else return a*b;}bool dfs(int cnt) //形参是指进行完运算后的结果{ ans=0; for(int i=0; i<5; i++) if(vis[i]) ans++; if(cnt==23&&ans==5) //如果结果是23且进行运算的数是5个则返回真 { flag=true; return 1; } for(int i=0; i<5; i++) //开始枚举下一个数 { if(!vis[i]) { vis[i]=true; //进行标记 for(int j=0; j<3; j++) //枚举三种运算 { if(dfs(cal(cnt,s[i],j))) return 1; } vis[i]=false; //取消标记,对于dfs来说,dfs前进行标记,dfs后取消标记 } } return 0;}int main(){ //freopen("lalala.text","r",stdin); while(~scanf("%d %d %d %d %d",&s[0],&s[1],&s[2],&s[3],&s[4])) { flag=false; for(int i=0; i<5; i++) //枚举每个数当起点 { memset(vis,0,sizeof(vis)); //清空标记数组 vis[i]=true; //把本身标记上 if(dfs(s[i])) //从本身开始搜 break; } if(flag) printf("Yes\n"); else printf("No\n"); } return 0;}</span></span>
0 0
- 奇妙的23点(OJ--3297
- 奇妙的23点
- SDUT 3297 奇妙的23点
- CDOJ (UESTC OJ) 1380 Xiper的奇妙历险(3)
- Go语言奇妙点
- 非常奇妙的证明:图形必在格点之外
- 非常奇妙的证明:图形必在格点之外
- XSS探究:对可利用点进行关联的奇妙旅程
- 奇妙的图片
- 行为学奇妙的联觉
- 奇妙的网络世界
- 奇妙的堆栈
- auto_ptr_ref的奇妙
- 奇妙的Base64编码
- 奇妙的“秒”世界
- 奇妙的7
- 奇妙的图片
- 奇妙的相亲数
- spring-扩展点-BeanPostProcessor
- order by 不走索引的思考
- 程序员的七年之痒(个人五年职业规划)
- sdutoj 3305
- 分支11 —— 分支17、分支19、分支20
- 奇妙的23点(OJ--3297
- 设置mysql字符集[Linux]
- 每天5道面试题(六)java基础
- 动态规划之背包问题(一)
- MySQL索引背后的数据结构及算法原理
- 最大子段和问题
- 操作注册表
- Vmware-桥接模式连接网络
- java 死锁产生原因及解锁