Cod sursa(job #2430158)

Utilizator BogBBogdan BogB Data 12 iunie 2019 22:34:22
Problema Combinari Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <cstdint>
#include <vector>
#include <cstdio>

bool findSuccessor(std::vector<int16_t> *stack, uint16_t count) {
    if (stack->back() == count - 1) return false;
    stack->back()++;
    return true;
}

bool validate(std::vector<int16_t> stack) {
    if(stack.size() > 1 && (stack.back() < stack[stack.size()-2])) return false;
        for (uint32_t i = 0; i < stack.size() - 1; i++) {
        if (stack.back() == stack[i]) return false;
    }
    return true;
}

void init(std::vector<int16_t> *stack) {
    stack->push_back(-1);
}

bool isSolution(std::vector<int16_t> stack, uint32_t valueCount) {
    return stack.size() == valueCount;
}

void handleSolution(std::vector<int16_t> stack, std::vector<int32_t> values, FILE * fisier) {
    for(int16_t index : stack) {
        fprintf(fisier, "%d ", values[index]);
    }
    fprintf(fisier, "\n");
}

int main() {
    std::vector<int32_t> values;
    FILE * fisier_out = fopen("combinari.out", "w");
    FILE * fisier_in = fopen("combinari.in", "r");

    uint16_t N,K;
    fscanf(fisier_in, "%hu", &N);
    fscanf(fisier_in, "%hu", &K);

    for (uint16_t i = 1; i <= N; i++) {
        values.push_back(i);
    }

    std::vector<int16_t> stack;
    init(&stack);

    while (!stack.empty()) {
        bool hasSuccessor;
        bool isValid;
        do {
            hasSuccessor = findSuccessor(&stack, N);
            if (hasSuccessor) {
                isValid = validate(stack);
            }else {
                isValid = false;
            }
        } while (hasSuccessor && !isValid);

        if(isValid) {
            if(isSolution(stack, K)) {
                handleSolution(stack, values, fisier_out);
            } else {
                if(stack.size() == K){
                    continue;
                }
                init(&stack);
            }
        } else {
            stack.pop_back();
        }
    }

    return 0;
}