/*
2787:算24
思路,递归,算四个数的24等于先算其中两个数,枚举加减乘除四种可能,然后算
三个数。
其中由于存在除法,故而应该用double来进行存储,浮点数是否等于0不能直接==0
*/
#include<iostream>
#include<cmath>
#define EPS 10e-8
using namespace std;
double a[8];
bool isZero(double a)
{
return fabs(a) < EPS;
}
//计算n个数是否为24
bool count24(double a[],int n)
{
if(n == 1) return isZero(a[0] - 24);
double b[8];
//枚举任意数组中两个数
for(int i = 0;i < n - 1;++i)
for(int j = i + 1;j < n;++j){
//把其他的数暂存到数组b中
int m = 0;
for(int k = 0;k < n;++k)
if(k != i && k != j) b[m++] = a[k];
//对选中的两个数进行加减乘除运算,如果有24,直接返回true
//此时b[m] 中m == n-1
b[m] = a[i] + a[j];
if(count24(b,n - 1)) return true;
b[m] = a[i] - a[j];
if(count24(b,n - 1)) return true;
b[m] = a[j] - a[i];
if(count24(b,n - 1)) return true;
b[m] = a[i] * a[j];
if(count24(b,n - 1)) return true;
if(!isZero(a[i])){
b[m] = a[j] / a[i];
if(count24(b,n - 1)) return true;
}
if(!isZero(a[j])){
b[m] = a[i] / a[j];
if(count24(b,n - 1)) return true;
}
} //for(int j = i + 1;j < n;++j)
//如果枚举完毕发现依旧无24,返回false
return false;
}
int main()
{
//freopen("C:\\Users\\ASUS\\Desktop\\test.txt","r",stdin);
for(int i = 0;i < 4;++i)
cin >> a[i];
while(!isZero(a[0])){
if(count24(a,4)) cout << "YES" << endl;
else cout << "NO" << endl;
for(int i = 0;i < 4;++i)
cin >> a[i];
}
return 0;
}
2787:算24
最新推荐文章于 2022-07-16 22:25:38 发布