mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
77 lines
1.8 KiB
C++
77 lines
1.8 KiB
C++
#include<stdio.h>
|
||
#include<stdlib.h>
|
||
#define SCD 666
|
||
|
||
//定义四则运算以及函数指针,注意调用除法判断除数不为0
|
||
double plus(double a,double b){return a+b;}
|
||
double jian(double a,double b){if(a-b < 0) return b-a; else return a-b;}
|
||
double cheng(double a,double b){return a*b;}
|
||
double devide (double a,double b){return a/b;}
|
||
double (*calc[4])(double ,double ) = { plus, jian, cheng, devide,};
|
||
|
||
//递归的判断函数,其中结果使用参数传递而不是返回值
|
||
int judge(bool *fb,double res,double *a,bool *ifa){
|
||
if(ifa[0] && ifa[1] && ifa[2] && ifa[3]){
|
||
if(res == 24){
|
||
*fb = true;
|
||
return SCD;
|
||
}
|
||
else
|
||
return 0;
|
||
}
|
||
//printf("in, res = %d\n",res);
|
||
for(int i = 0; i < 4; i++){
|
||
if(!ifa[i]){
|
||
ifa[i] = true;
|
||
for(int j = 0; j < 3; j++)
|
||
if(judge(fb,calc[j](res,a[i]),a,ifa) == SCD)
|
||
return SCD;
|
||
if(a[i] != 0)
|
||
if(judge(fb,calc[3](res,a[i]),a,ifa) == SCD)
|
||
return SCD;
|
||
ifa[i] = false;
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int main(int argc,char** argv){
|
||
//要读进来的四个数
|
||
int a1[4];
|
||
double a[4];
|
||
//保存结果的数组
|
||
bool sb[1000];
|
||
//计数器,用来控制输出结果
|
||
int cnt = 0;
|
||
while(true){
|
||
//计算结果
|
||
double res = 0;
|
||
//判断结果
|
||
bool fb = false;
|
||
//是否被使用了
|
||
bool ifa[4] = {false};
|
||
scanf("%d %d %d %d",&a1[0],&a1[1],&a1[2],&a1[3]);
|
||
for(int i = 0; i < 4; i++)
|
||
a[i] = a1[i];
|
||
//判断是否结束输入
|
||
if((a[0] == 0.0) && (a[1] == 0.0) && (a[2] == 0.0) &&(a[3] == 0.0))
|
||
break;
|
||
//判断
|
||
judge(&fb,res,a,ifa);
|
||
//把结果写进去
|
||
sb[cnt] = fb;
|
||
//计数器自增
|
||
cnt++;
|
||
}
|
||
//控制输出
|
||
for(int i = 0; i < cnt; i++){
|
||
if(sb[i]){
|
||
printf("YES\n");
|
||
}
|
||
else{
|
||
printf("NO\n");
|
||
}
|
||
}
|
||
return 0;
|
||
}
|