24点
24点是一种老少咸宜的游戏,它的具体玩法如下:
给玩家4张牌,每张牌的面值在1~13之间,允许其中有数值相同的牌。采用加、减、乘、除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能使用一次,尝试构造一个表达式,使其运算结果为24。
请你根据上述游戏规则构造一个24点游戏的算法,要求如下:
输入:n1,n2,n3,n4
输出:若能得到运算结果为24,则输出一个对应的运算表达式;若不能,则输出“No answer”
输入样例:11,8,3,5
输出样例:(11-8)*(3+5)=24
输入样例:3,8,8,10
输出样例:(8*10-8)/3=24
输入样例:1,1,1,1
输出样例:No answer
把所有可能的组合方式列出来
#include<iostream> #include<cstdlib> using namespace std; int F(int a,int ch,int b) { switch(ch) { case 0:return a+b; case 1:return a-b; case 2:return a*b; case 3:if(b!=0&&(a%b==0)) return a/b;else return -100; } } char p(int i) { switch(i) { case 0:return '+'; case 1:return '-'; case 2:return '*'; case 3:return '/'; } } void is24(int *a){ int i,j,k; for(i=0;i<4;i++) for(j=0;j<4;j++) for(k=0;k<4;k++) { if(F(F(F(a[0],i,a[1]),j,a[2]),k,a[3])==24) { cout<<'('<<'('<<a[0]<<p(i)<<a[1]<<')'<<p(j)<<a[2]<<')'<<p(k)<<a[3]<<endl; exit(0); } if(F(F(a[0],i,F(a[1],j,a[2])),k,a[3])==24) { cout<<'('<<a[0]<<p(i)<<'('<<a[1]<<p(j)<<a[2]<<')'<<')'<<p(k)<<a[3]<<endl; exit(0); } if(F(F(a[0],i,a[1]),j,F(a[2],k,a[3]))==24) { cout<<i<<j<<k<<endl; cout<<'('<<a[0]<<p(i)<<a[1]<<')'<<p(j)<<'('<<a[2]<<p(k)<<a[3]<<')'<<endl; exit(0); } if(F(a[0],i,F(F(a[1],j,a[2]),k,a[3]))==24) { cout<<a[0]<<p(i)<<'('<<'('<<a[1]<<p(j)<<a[2]<<')'<<p(k)<<a[3]<<')'<<endl; exit(0); } } return; } void go(int *a,const int n){ int i; if(n>3) { is24(a); return; } for(i=n;i<4;i++) { swap(a[n],a[i]); go(a,n+1); swap(a[n],a[i]); } } int main() { int a[4]; char ch; cin>>a[0]>>ch>>a[1]>>ch>>a[2]>>ch>>a[3];//格式为 1,2,3,4 用逗号隔开 go(a,0); cout<<"No answer"<<endl; return 0; }