#include #include #include #define IO_ERROR 3 #define DEPENDENCY_LOOP 2 #define BAD_INPUT_FORMAT 1 int main(int argc, char *argv[]) { static uint32_t prereq[26] = {0}; uint32_t incomplete = 0; int error; /* Grab all the input rules. */ { FILE *input; error = IO_ERROR; if (input = fopen(argc > 1? argv[1]: "input.txt", "r")) { #define MAX_INPUT_WIDTH 50 static char buf[MAX_INPUT_WIDTH]; error = 0; while (fgets(buf, MAX_INPUT_WIDTH, input)) { char pre, step; static char format[] = "Step %c must be finished before step %c can begin."; error = BAD_INPUT_FORMAT; if ( buf[strlen(buf) - 1] == '\n' && sscanf(buf, format, &pre, &step) == 2 && 'A' <= pre && pre <= 'Z' && 'A' <= step && step <= 'Z' ) { error = 0; prereq[step - 'A'] |= 1 << pre - 'A'; incomplete |= 1 << pre - 'A' | 1 << step - 'A'; } if (error) break; } fclose(input); } if (error) return error; } /* Keep running the first ready task until either they're * all complete or progress is blocked by a dependency loop. */ while (incomplete) { uint32_t progress, taskbit; int task; progress = 0; for (task = 0, taskbit = 1; task < 26; ++task, taskbit <<= 1) { if ((taskbit & incomplete) && !(prereq[task] & incomplete)) { putchar(task + 'A'); progress |= taskbit; incomplete &= ~taskbit; break; } } if (!progress) { error = DEPENDENCY_LOOP; break; } } putchar('\n'); return error; }