深搜专题初步-1006

来源:互联网 发布:雪迪龙网络报销系统 编辑:程序博客网 时间:2024/05/21 06:19

1006

时间限制(普通/Java):1000MS/10000MS     内存限制:65536KByte
总提交: 8            测试通过: 5

描述

速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。

输入

每组输入数据占一行,给定四张牌。

输出

每一组输入数据对应一行输出。如果有解则输出"Yes",无解则输出"No"。

样例输入

A 2 3 63 3 8 8

样例输出

YesNo

代码:

#include<cstdio>#include<string.h>#include<algorithm>using namespace std;int flag;int num[4];int cmp(const void *a,const void *b){return *(int *)a-*(int *)b;} void dfs(int sum,int cur,int m){  if(flag)  return;  if(m==3)  {  if(sum+cur==24||sum-cur==24||sum*cur==24)   flag=1;   if(cur!=0&&sum%cur==0&&sum/cur==24)   flag=1;   return;  }  dfs(sum+cur,num[m+1],m+1);  dfs(sum-cur,num[m+1],m+1);  dfs(sum*cur,num[m+1],m+1);  if(cur!=0&&sum%cur==0)  dfs(sum/cur,num[m+1],m+1);  dfs(sum,cur+num[m+1],m+1);  dfs(sum,cur-num[m+1],m+1);  dfs(sum,cur*num[m+1],m+1);  if(num[m+1]!=0&&cur%num[m+1]==0)  dfs(sum,cur/num[m+1],m+1);}int main(){int i;char str[5];while(~scanf("%s",str)){if(strlen(str)==2)num[0]=10;else {if(str[0]=='A')num[0]=1;else if(str[0]=='J')num[0]=11;else if(str[0]=='Q')num[0]=12;else if(str[0]=='K')num[0]=13;    else    num[0]=str[0]-'0'; }for(i=1;i<=3;i++){scanf("%s",str);if(strlen(str)==2)num[i]=10;else {        if(str[0]=='A')                num[i]=1;else if(str[0]=='J')num[i]=11;else if(str[0]=='Q')num[i]=12;else if(str[0]=='K')num[i]=13;else num[i]=str[0]-'0';}}qsort(num,4,sizeof(num[0]),cmp);flag=0;do{dfs(num[0],num[1],1);}while(next_permutation(num,num+4)&&!flag);if(flag)printf("Yes\n");else printf("No\n");}return 0;}
   



0 0