Beispiel #1
0
void scene_print(scene *s)
{
    printf("\n\tScene\n");
    printf("Background color:\n");
    rgb_print(s->bg);
    sl_print(s->spheres);
    light_print(s->light);
    rgb_print(s->amb);
}
Beispiel #2
0
int main(int argc, char** argv) {
    FILE *fin, *fout;
    fin = fopen("lamps.in", "r");
    fout = fopen("lamps.out", "w");

    unsigned char final_on;
    unsigned char final_off;
    unsigned char lights_original;
    unsigned char actions[] = {
        0,
        0x3F,
        0x2A,
        0x15,
        0x24
    };
    unsigned char tmp, final;
    unsigned char results[11];
    // zero to indicate empty action
    // -1 to indicate action end
    // -2 to indicate end
    int action_sequence1[] = {
        1, -1,
        2, -1,
        3, -1,
        4, -1,
        -2
    };
    int action_sequence2[] = {
        1, 2, -1,
        1, 3, -1,
        1, 4, -1,
        2, 3, -1,
        2, 4, -1,
        3, 4, -1,
        0, -1,
        -2
    };
    int action_sequence3[] = {
        1, 2, 4, -1,
        1, 3, 4, -1,
        2, 3, 4, -1,
        1, -1,
        2, -1,
        3, -1,
        4, -1,
        0, -1,
        -2
    };
    int action_sequence4[] = {
        1, -1,
        2, -1,
        3, -1,
        4, -1,
        1, 2, -1,
        1, 3, -1,
        1, 4, -1,
        2, 3, -1,
        2, 4, -1,
        3, 4, -1,
        0, -1,
        -2
    };
    int *applied_sequence;
    int *current_action;

    int lights;
    int counts;
    int i;
    int j;

    fscanf(fin, "%d", &lights);
    fscanf(fin, "%d", &counts);

    i = lights;
    lights_original = 0;
    for (i = 0; i < 6 && i < lights; i++) {
        lights_original |= 1 << (5 - i);
    }

    final_on = 0;
    while (1) {
        fscanf(fin, "%d", &i);
        if (i != -1) {
            final_on |= 1 << (5 - (i - 1) % 6);
        } else {
            break;
        }
    }

    final_off = 0;
    while (1) {
        fscanf(fin, "%d", &i);
        if (i != -1) {
            final_off |= 1 << (5 - (i-1) % 6);
        } else {
            break;
        }
    }

    if (final_off & final_on) {
        fprintf(fout, "IMPOSSIBLE\n");
        return 0;
    }

    if (counts == 0) {
        if (lights_original & final_on != final_on) {
            fprintf(fout, "IMPOSSIBLE\n");
            return 0;
        }

        if (lights_original & final_off ^ final_off != final_off) {
            fprintf(fout, "IMPOSSIBLE\n");
            return 0;
        }

        light_print(fout, lights_original, lights);

        return 0;
    }

    if (counts > 4) {
        if (counts & 1) {
            counts = 3;
        } else {
            counts = 4;
        }
    }
    switch (counts) {
        case 1:
            applied_sequence = action_sequence1;
            break;
        case 2:
            applied_sequence = action_sequence2;
            break;
        case 3:
            applied_sequence = action_sequence3;
            break;
        case 4:
            applied_sequence = action_sequence4;
            break;
        default:
            break;
    }

    i = 0;
    current_action = applied_sequence;
    while (*current_action != -2) {
        final = lights_original;
        while (*current_action != -1) {
            if (*current_action != 0) {
                final ^= actions[*current_action];
            }
            current_action++;
        }