// Arup Guha
// 3/13/2024
// Solution to COP 3502H Exam 2 Question 3

#include <stdio.h>
#include <string.h>

void go(char* cur, int k, int n);

int main() {

    char word[8];
    word[0] = '\0';
    go(word, 0, 7);
    return 0;
}

// Prints all upward strings of length n with cur[0..k-1] fixed.
void go(char* cur, int k, int n) {

    // Filled it in, print it.
    if (strlen(cur) == n) {
        cur[k] = '\0';
        printf("%s\n", cur);
        return;
    }

    // Set start equal to the 0-based rank of the first valid letter for slot k.
    int start = 0;

    // Get the previous letter rank and add 1, if there is a previous letter.
    if (k > 0) start = cur[k-1]-'a'+1;

    // Try each letter with rank i in slot k.
    for (int i=start; i<26; i++) {

        // Put the letter.
        cur[k] = (char)('a'+i);

        // Add the null char so our string is valid.
        cur[k+1] = '\0';

        // Recurse!
        go(cur, k+1, n);
    }
}
