奇妙的23点
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
题意很简单,给出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
提示
提示
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
int flag=0;
int vis[55];
int a[6];
char c[]= {'+','-','*'};
int DFS(int i ,int ans,int num)
{
if(flag||num>5)
return 0;
if(ans==23&&num==5)
{
flag=1;
return 1;
}
for(int j=0; j<5; j++)
for(int i=0; i<3; i++)
{
if(vis[j]==0)
{
vis[j]=1;
if(i==0)
DFS(j,ans+a[j],num+1);
else if(i==1)
DFS(j,ans-a[j],num+1);
else
DFS(j,ans*a[j],num+1);
vis[j]=0;
}
}
return 0;
}
int main()
{
while(~scanf("%d",&a[0]))
{
flag=0;
for(int i=1; i<5; i++)
scanf("%d",&a[i]);
for(int i=0; i<5; i++)
{
memset(vis,0,sizeof(vis));
vis[i]=1;
DFS(i,a[i],1);
if(flag)
break;
}
if(flag==0)
printf("No\n");
else
printf("Yes\n");
}
}