您的位置:首页 > 其它

奇妙的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>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: