Cod sursa(job #554157)

Utilizator bbooggddaannpuicar bogdan bbooggddaann Data 14 martie 2011 17:29:49
Problema Combinari Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <fstream>

using namespace std;

int n, a[19], k;
ifstream fi("combinari.in");
ofstream fo("combinari.out");

// La fiecare apel se stabileste o valoare in sir.
void comb (int l) { // se va pune o valoare pe locul l
  int i, linf, lsup; // variabila locala, memorata separat pentru fiecare apel

  if (l <= k) { // conditie care "protejeaza"
    linf = a[l-1] + 1; lsup = n - k + l;
    for (i = linf; i <= lsup; i++) {  // i este valoarea care se pune pe locul l
      a[l] = i;
      comb (l + 1); // la pasul urmator vom pune valoare pe locul l+1
    }
  }
  else {
    for (i = 1; i <= k; i++)
      fo << a[i] << ' ';
    fo << '\n';
  }
}

int main () {
  fi >> n >> k;
  comb (1); // mai intai punem o valoare pe locul 1 din k-uplu
  return 0;
}
/*
#include <fstream>

using namespace std;

int nl, nc, l, c, clu, aux, l1, l2;
long s[3][252], ss, sp;
int a[252][252];
ifstream fi("lacusta.in");
ofstream fo("lacusta.out");

int main () {
  fi >> nl >> nc;
  for (l = 1; l <= nl; l++)
    for (c = 1; c <= nc; c++)
      fi >> a[l][c];
  s[1][1] = 2000000000;          // ca sa nu se coboare pe coloana 1, fara sa se faca un salt pe linia 1
  for (c = 2; c <= nc; c++)      // prima linie se actualizeaza separat_
    s[1][c] = a[1][1] + a[1][c]; // pentru ca nu se actualizeaza prin pas+salt
  l1 = 1; l2 = 2;
  for (l = 2; l <= nl; l++) {         // a[l-1][c] isi va actualiza vecinii prin succesiunea pas+salt.
    for (c = 1; c <= nc; c++)
      s[l2][c] = 2000000000;
    for (c = 1; c <= nc; c++) {       // coloana pe care se face coborarea
      sp = s[l1][c] + a[l][c];        // suma corespunzatoare pasului de coborare
      for (clu = 1; clu <= nc; clu++) // coloana din linia urmatoare
        if (clu != c) {               // Nu se actualizeaza daca se coboara fara a se face si salt.
          ss = sp + a[l][clu];        // suma pentru saltul pe linia l
          if (s[l2][clu] > ss)        // ss mai mic decat minimul curent de pe coloana clu.
            s[l2][clu] = ss;          // Actualizam minimul.
        }
    }
    aux = l1; l1 = l2; l2 = aux; // Interschimbam cele doua linii utilizate
  }
  fo << s[l1][nc];
  return 0;
}

// 70 de puncte (30 acordate) daca se lucreaza cu matrici de int pentru a si s.
// Timpul este la limita!


*/