Pagini recente » Cod sursa (job #1269725) | Cod sursa (job #525066) | Monitorul de evaluare | Istoria paginii runda/biti3/clasament | Cod sursa (job #2430156)
#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[stack.size()-1] < 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;
}