DFS_3

来源:互联网 发布:生物医药大数据 编辑:程序博客网 时间:2024/05/16 14:31

Description

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

Input

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

Output

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

Sample Input

A 2 3 63 3 8 8

Sample Output

YesNo

经典的24点问题,包含了很多细节处理

1. STL中next_permutation全排列,具体用法我忘了,当时是百度的,现在再抄一遍

1:从后向前比较相邻的两个元素,直到前一个元素小于后一个元素,停止

2:如果已经没有了前一个元素,则说明这个排列是递减的,所以这个排列是没有下一个排列的。

所以源代码先升序排序,然后全排列就可以把所以情况都列一遍。


2.除法限制条件较多,要特别处理

3.输入char型并预处理A,J,Q,K,int -‘0’相当于得到数字本身

4.注意加括号的等价方法(当初想了好久)


#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#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)/*分前后两个位置,2*4除法特别处理,dfs位置替换相当于添加括号*/{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)!=EOF){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;elsenum[0]=str[0]-'0';/*str-'0'相当于把char型的数字转化为int型的数字*/}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");elseprintf("No\n");}return 0;}


0 0
原创粉丝点击