Cod sursa(job #1231231)

Utilizator thinkphpAdrian Statescu thinkphp Data 19 septembrie 2014 23:22:26
Problema Combinari Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>
#define MAXN 100
#define FIN "combinari.in"
#define FOUT "combinari.out"

//function prototypes
void read();
void init();
int solution();
void printSolution();
int isValid();
int has_next();
void back();    

int stack[ MAXN ], level, n, k;

int main() {

      read();
      back();

  return(0);
};

void read() {

     freopen(FIN, "r", stdin);

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

     fclose( stdin );
};

void back() {

     int HS;

     freopen(FOUT, "w", stdout);

     level = 1;

     init();

     while( level > 0 ) {

            do{}while( ( HS = has_next() ) && !isValid() );

            if( HS )

                if( solution() )

                        printSolution();

                else level++, init();

            else level--;
     }  

     fclose( stdout );
};

void init() {

     if(level > 1) stack[ level ] = stack[ level - 1 ];

     else stack[ level ] = 0; 
};

int solution() {

    return level == k;
};

void printSolution() {

     int i;

     for(i = 1; i <= k; i++) printf("%d ", stack[ i ]);

     printf("\n");
};

int isValid() {

    int i;

    for(i = 1; i <= level - 1; i++) {

            if(stack[ i ] == stack[ level ]) return 0;
    }

    return 1;      
};

int has_next() {

    if(stack[ level ] < n - k + level) {

       stack[ level ]++;

       return 1;
    }

    return 0; 
};