奇妙的23点(OJ--3297
2015-08-29 09:36
405 查看
题目描述
题意很简单,给出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-12
using 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>
相关文章推荐
- 1021 -- 最后的胜利者
- linux 下结合find 和 rm 删除大量文件
- java多线程 —— 为什么弃用stop和suspend
- [Java Concurrency in Practice]第七章 取消与关闭
- ZOJ 1586 QS Network
- 作用域操作符 :: 的理解
- Ubuntu 12.04 安装深度音乐播放器和百度音乐插件
- Source Insight 多标签插件
- POJ 1065 Wooden Sticks
- android 判断手机中是否有SD卡,USB。静态判断
- 十年前一起搬砖,现在身价相差300亿
- LeetCode2.2.2(Reverse Linked List II)
- jsp过滤器
- Struts(3)的工作机制及分析
- Struts(2)环境搭建
- 线程的join方法
- 队列小述
- SpringMVC详解(一)简介
- Spring MVC详解(二)Spring Web MVC是什么
- Spring MVC详解(三)DispatcherServlet作用