Cod sursa(job #2173798)

Utilizator 24601Dan Ban 24601 Data 16 martie 2018 01:49:46
Problema Combinari Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.3 kb
#include <inttypes.h>
#include <stdio.h>
#include <string.h>

#define SIZE 18

static uint8_t sol[SIZE+1], n, k;

static void comb(uint8_t l)
{
    uint8_t i;

    if(l == k) {
        for(i = 0; i < k; i++) {
            printf("%" PRIu8 "%c", sol[i], " \n"[i == k - 1]);
        }
    } else {
        for(i = sol[l - 1] + 1; i <= n; ++i) {
            sol[l] = i;
            comb(l + 1);
        }
    }
}

static void comb_iter(void)
{
    int iter[SIZE], lvl[SIZE], lvl_top, nivel, i;

    lvl_top = 0;
    lvl[lvl_top++] = 0;
    memset(iter, 0x00, sizeof iter);

    while (lvl_top > 0) {
        nivel = lvl[lvl_top - 1];

        if (nivel == k) {
            for (i = 1; i <= k; i++) {
                printf("%" PRIu8 "%c", sol[i], " \n"[i == k]);
            }
            lvl_top--;
        } else {
            if (sol[nivel] + 1 + iter[nivel + 1] <= n) {
                sol[nivel + 1] = sol[nivel] + 1 + iter[nivel + 1];
                iter[nivel + 1]++;
                lvl[lvl_top++] = nivel + 1;
            } else {
                iter[nivel + 1] = 0;
                lvl_top--;
            }
        }
    }
}

int main(void)
{
    freopen("combinari.in", "r", stdin);
    freopen("combinari.out", "w", stdout);

    scanf("%" SCNu8 "%" SCNu8, &n, &k);

    /*comb(0);*/
    comb_iter();

    return 0;
}