enum{false,true}flag; 这里哪错了站长

tctm169 杀手 2024-06-05 21:01:21 2024-06-05 21:01:43 8

#include <bits/stdc++.h> #include #include #include #include #include #include #include #include #include <stdio.h> #include <math.h> using namespace std; enum{false,true}flag;

void expression(short k,doubleTemp){ double temp[4],a,b; int t; if(k==1){ if(fabs(Temp-24) < 1e-6) flag=true; }else{ for(int i1=0;i1<k;i1++){ for(int i2=0;i2<k;i2++){ if(i1==i2){ a=(Temp+i1); b=(Temp+i2); t=0; for(int j=0;j<k;j++){ if(j!=i1&&j!=i2) temp[t++]=(Temp+j); } for(int j=0;j<4;j++){ switch(j){ case 0: temp[t] = a+b; break; case 1: temp[t] = a-b; break; case 2: temp[t] = ab; break; case 3: if(fabs(b-0)>=1e-6) temp[t] = a/b; break; } expression(k-1,temp); if(flag) return; } } } } } } int main(){ double temp[4]; while(1){ for(int i=0;i<4;i++) scanf("%lf",&temp[i]); if(!temp[0]) break; flag=false; expression(4,temp); if(flag) printf("YES\n"); else printf("NO\n"); } }

{{ vote && vote.total.up }}

共 2 条回复

root 站长
#include <bits/stdc++.h>
using namespace std;

bool flag;

void expression(short k, double* Temp) {
    double temp[4];
    if (k == 1) {
        if (fabs(Temp[0] - 24) < 1e-6)
            flag = true;
    } else {
        for (int i1 = 0; i1 < k; i1++) {
            for (int i2 = 0; i2 < k; i2++) {
                if (i1 == i2)
                    continue;  // 避免访问到相同的元素
                double a = Temp[i1];
                double b = Temp[i2];
                int t = 0;
                for (int j = 0; j < k; j++) {
                    if (j != i1 && j != i2)
                        temp[t++] = Temp[j];
                }
                // 加法
                temp[t] = a + b;
                expression(k - 1, temp);
                if (flag)
                    return;

                // 减法
                temp[t] = a - b;
                expression(k - 1, temp);
                if (flag)
                    return;

                temp[t] = b - a;
                expression(k - 1, temp);
                if (flag)
                    return;

                // 乘法
                temp[t] = a * b;
                expression(k - 1, temp);
                if (flag)
                    return;

                // 除法
                if (fabs(b) > 1e-6) {
                    temp[t] = a / b;
                    expression(k - 1, temp);
                    if (flag)
                        return;
                }
                if (fabs(a) > 1e-6) {
                    temp[t] = b / a;
                    expression(k - 1, temp);
                    if (flag)
                        return;
                }
            }
        }
    }
}

int main() {
    double temp[4];
    while (true) {
        for (int i = 0; i < 4; i++) {
            scanf("%lf", &temp[i]);
        }
        if (temp[0] == 0)
            return 0;
        flag = false;
        expression(4, temp);
        if (flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
root 站长

避免访问相同元素:添加 continue 语句,避免进入相同的元素。
改正逻辑错误:每次调用 expression 函数时,确保 temp 数组中正确的元素传递。