~万物皆可递归~ #include
bool s;
void cacuCheck(double num[],bool visited[],int rest){
if (rest==1) {
for (int i=0; i<4; i++)
if (!visited[i])
if (num[i]==24)
s=true;
return;
}
for (int i=0; i<4; i++) {
if (!visited[i]) {
for (int j=i+1; j<4; j++) {
if (!visited[j]) {
double a=num[i];
double b=num[j];
visited[i]=true;
visited[j]=true;
for (int k=0; k<4; k++) {
switch (k) {
case 0:
num[i]=a+b;
visited[i]=false;
cacuCheck(num, visited, rest-1);
break;
case 1:
num[i]=a-b;
visited[i]=false;
cacuCheck(num, visited, rest-1);
num[i]=b-a;
visited[i]=false;
cacuCheck(num, visited, rest-1);
break;
case 2:
num[i]=a*b;
visited[i]=false;
cacuCheck(num, visited, rest-1);
break;
case 3:
if (a!=0) {
num[i]=b/a;
visited[i]=false;
cacuCheck(num, visited, rest-1);
break;
}
if (b!=0) {
num[i]=a/b;
visited[i]=false;
cacuCheck(num, visited, rest-1);
break;
}
break;
default:
break;
}
}
num[i]=a;
num[j]=b;
visited[i]=false;
visited[j]=false;
}
}
}
}
}
int main(){
void cacuCheck(double [],bool [],int );
double num[4];
while (~scanf("%lf%lf%lf%lf",&num[0],&num[1],&num[2],&num[3])) {
bool visited[4]={false};
s=false;
//按序从列表选择两数
for (int i=0; i<4; i++) {
for (int j=i+1; j<4; j++) {
double a=num[i];
double b=num[j];
visited[i]=true;
visited[j]=true;
for (int k=0; k<4; k++) { //两数依次作加减乘除运算,结果重新填入列表中
switch (k) {
case 0:
num[i]=a+b;
visited[i]=false;
cacuCheck(num, visited, 3);
break;
case 1:
num[i]=a-b;
visited[i]=false;
cacuCheck(num, visited, 3);
num[i]=b-a;
visited[i]=false;
cacuCheck(num, visited, 3);
break;
case 2:
num[i]=a*b;
visited[i]=false;
cacuCheck(num, visited, 3);
break;
case 3:
if (a!=0) {
num[i]=b/a;
visited[i]=false;
cacuCheck(num, visited, 3);
break;
}
if (b!=0) {
num[i]=a/b;
visited[i]=false;
cacuCheck(num, visited, 3);
break;
}
break;
default:
break;
}
}
num[i]=a;
num[j]=b;
visited[i]=false;
visited[j]=false;
if (s)
break;
}
if (s)
break;
}
if (s)
printf("true\n");
else
printf("false\n");
}
return 0;
}