题目链接:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1267
【问题描述】
几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”。您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,要求运算结果等于24。
您可以使用的运算只有:+,-,*,/,您还可以使用()来改变运算顺序。注意:所有的中间结果须是整数,所以一些除法运算是不允许的(例如,(2*2)/4是合法的,2*(2/4)是不合法的)。下面我们给出一个游戏的具体例子:
若给出的4个操作数是:1、2、3、7,则一种可能的解答是1+2+3*7=24。
【输入】
只有一行,四个1到9之间的自然数。
【输出】
如果有解的话,只要输出一个解,输出的是三行数据,分别表示运算的步骤。其中第一行是输入的两个数和一个运算符和运算后的结果,第二行是第一行的结果和一个输入的数据、运算符、运算后的结果;第三行是第二行的结果和输入的一个数、运算符和“=24”。如果两个操作数有大小的话则先输出大的。
如果没有解则输出“No answer!”
【输入样例】
1 2 3 7
【输出样例】
2+1=3
7*3=21
21+3=24
代码:(粘贴过来的)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include <algorithm> using namespace std; bool flag; int num[4]; struct node { int a,b,sum;//sum存放a,b经过oper运算之后的值 char oper; }; void dfs(int cur,int a,int b,queue <node> route) { if(flag) return ; if(cur==3)//计算收尾 { if(((a+b)==24)||((a-b)==24)||((a*b)==24)||(b!=0&&a%b==0&&a/b==24)){//如果经过上面的计算得到解 while(!route.empty()){ node now=route.front(); printf("%d%c%d=%d\n",now.a,now.oper,now.b,now.sum);//依次输出前面的计算过程 route.pop(); } if((a+b)==24){ if(b>a) swap(a,b); printf("%d+%d=%d\n",a,b,a+b); } if((a-b)==24) printf("%d-%d=%d\n",a,b,a-b); if((a*b)==24) { if(b>a) swap(a,b); printf("%d*%d=%d\n",a,b,a*b); } if(a%b==0&&b!=0&&(a/b)==24) printf("%d/%d=%d\n",a,b,a/b);//a/b比较特殊,要求结果必须是整数 flag=true;//表示找到解,一旦找到任何一个解就退出 } return ; } queue <node> temp=route; node x; x.a=a,x.b=b,x.sum=a+b,x.oper='+'; if(b>a) swap(x.a,x.b); temp.push(x); dfs(cur+1,a+b,num[cur+1],temp);//(((a*b)*c)*d) 模型 temp=route; x.a=a,x.b=b,x.sum=a*b,x.oper='*'; if(b>a) swap(x.a,x.b); temp.push(x); dfs(cur+1,a*b,num[cur+1],temp); temp=route; x.a=a,x.b=b,x.sum=a-b,x.oper='-'; temp.push(x); dfs(cur+1,a-b,num[cur+1],temp); if(b!=0&&a%b==0){//a/b需要验证合法性 temp=route; x.a=a,x.b=b,x.sum=a/b,x.oper='/'; temp.push(x); dfs(cur+1,a/b,num[cur+1],temp); } temp=route; x.a=b,x.b=num[cur+1],x.sum=b+num[cur+1],x.oper='+'; if(x.b>x.a) swap(x.a,x.b); temp.push(x); dfs(cur+1,a,b+num[cur+1],temp);//a*((b*c)*d) 模型 temp=route; x.a=b,x.b=num[cur+1],x.sum=b*num[cur+1],x.oper='*'; if(x.b>x.a) swap(x.a,x.b); temp.push(x); dfs(cur+1,a,b*num[cur+1],temp); temp=route; x.a=b,x.b=num[cur+1],x.sum=b-num[cur+1],x.oper='-'; temp.push(x); dfs(cur+1,a,b-num[cur+1],temp); if(num[cur+1]!=0&&b%num[cur+1]==0) { temp=route; x.a=b,x.b=num[cur+1],x.sum=b/num[cur+1],x.oper='/'; temp.push(x); dfs(cur+1,a,b/num[cur+1],temp); } } int main() { //freopen("point24.in","r",stdin);//输入输出重定向 //freopen("point24.out","w",stdout); queue <node> t; scanf("%d %d %d %d",&num[0],&num[1],&num[2],&num[3]); while(!flag){ dfs(1,num[0],num[1],t); printf("%d %d %d %d\n",num[0],num[1],num[2],num[3]); if(!next_permutation(num,num+4)) break; } if(!flag) printf("No answer!\n"); system("pause"); return 0; }