/* License: AGPLv3 or later. https://www.gnu.org/licenses/licenses.html * * Exercise 9 - Dynamic Programming: Crazy Eights (Week 10) * Name: Manish * Student Login: ***** * * Compile as: * $ gcc -std=c11 -Wall -o ex9 ex9.c */ #include #include int max(int i, int j); int main(void) { printf("Enter file name: "); // Assuming filename/file path will not be longer than 256 characters char filename[257]; scanf("%s", filename); FILE* file = fopen(filename, "r"); if (!file) { perror(filename); exit(EXIT_FAILURE); } // 0th index is dummy card char cards[53][2]; int size = 0; int length[53] = {0}; // all get initialized to 0; int parent[53] = {0}; // all get initialized to 0; int max_leaf = 0; // index of last card of longest chain // Dummy card as first card cards[size][0] = '8'; cards[size++][1] = 'S'; // Read and add cards while (fscanf(file, " %2c ", cards[size++]) != EOF) { } int current_length; int current_parent; for (int i=1; i < size; i++) { current_length = 1; current_parent = 0; for (int j = i-1; j >= 0; j--) { if (cards[i][0] == cards[j][0] || cards[i][1] == cards[j][1] || cards[i][0] == '8' || cards[j][0] == '8' ) { if (current_length < length[j]+1) { current_length = length[j]+1; current_parent = j; } } } length[i] = current_length; parent[i] = current_parent; if (length[max_leaf] < current_length) max_leaf = i; } // find first card of longest chain int first = max_leaf; while (parent[first] != 0) first = parent[first]; printf( "Longest sequence length: %d\n" "First card in longest sequence: %.2s\n" "Last card in longest sequence: %.2s\n", length[max_leaf], cards[first], cards[max_leaf] ); fclose(file); return 0; }