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