题目描述
快算24点游戏规则是这样的,作为游戏者将得到4个1~9之间的自然数作为操作数,而你的任务是对这4个操作数进行 +,-,*,/ 的4种运算,要求运算结果等于24。
你可以用( )来改变运算顺序。注意,所有的中间结果必须是整数,所以一些除法运算是不允许的(例如(2*2)/4是合法的,2*(2/4)是不合法的)。
下面给出一个游戏的具体例子:
若给出的4个操作数是1、2、3、7,则一种可能的解答是 1+2+3*7=24。
输入:输入4个1~9之间的自然数。
输出:如果有解的话,只需输出一个解,输出的是三行数据,分别表示运算的步骤,如果两个操作数有大小的话则先输出大的,如果没有解则输出“No”。
AC代码:
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int a[5];
char opt[5] = {' ','+','-','*','/'};
int i,j,k;
int ff(int x,int ch,int y){
if(ch == 1) return x + y;
if(ch == 2) return max(x,y) - min(x,y);
if(ch == 3) return x * y;
if(ch == 4) return (y == 0 || x < y || x % y != 0) ? -999999 : x / y;
}
void pf(int a,int b,int c,int d,int e,int f)
{
cout << max(a,b) << opt[i] << min(a,b) << "=" << ff(max(a,b),i,min(a,b)) << endl;
cout << max(c,d) << opt[j] << min(c,d) << "=" << ff(max(c,d),j,min(c,d)) << endl;
cout << max(e,f) << opt[k] << min(e,f) << "=" << ff(max(e,f),k,min(e,f)) << endl;
exit(0);
}
int main()
{
cin >> a[1] >> a[2] >> a[3] >> a[4];
sort(a + 1,a + 5);
do{
for( i = 1;i <= 4;i ++){ // 枚举 符号
for( j = 1;j <= 4;j ++)
{
for( k = 1;k <= 4;k ++){
// ((a ? b) ? c) ? d
if(ff(ff(ff(a[1],i,a[2]),j,a[3]),k,a[4]) == 24)
pf(a[1],a[2],ff(a[1],i,a[2]),a[3],ff(ff(a[1],i,a[2]),j,a[3]),a[4]);
// (a?b)?(c?d)
else if(ff(ff(a[1],i,a[2]),k,ff(a[3],j,a[4])) == 24)
pf(a[1],a[2],a[3],a[4],ff(a[1],i,a[2]),ff(a[3],j,a[4]));
}
}
}
}while(next_permutation(a + 1,a + 5));
return 0;
}
运行结果

完结撒花✿✿ヽ(°▽°)ノ✿
都看到这里了,确定不给一个赞吗?