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); }
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++; }