Cod sursa(job #610933)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 29 august 2011 18:42:41
Problema Combinari Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<cstdio>
#include <vector>

using namespace std;

class choose {

  int elements;
  vector <int> state;

  public:
    choose();
    choose(const choose &c);
    choose(int elm, int choose);

    bool hasNext() const;
    vector <int> next();
    vector <int> getState() const;

    ~choose();
};


choose::choose() {
  elements = 0;
}

choose::choose(const choose &c) {
  elements = c.elements;
  state = c.state;
}

choose::choose(int elm, int choose) {
  elements = elm;
  for(int i = 1; i <= choose; ++i)
    state.push_back(i);
}

bool choose::hasNext() const {

  if(state.empty()) {
    return false;
  }

  for(unsigned i = 0; i + 1 < state.size(); ++i)
    if(state[i] + 1 != state[i+1]) {
      return true;
    }

  if(state.back() < elements) {
    return true;
  }

  return false;
}

vector <int> choose::next() {

  for(int i = state.size() - 1; i >= 0; --i)
    if(state[i] != elements - ((int)state.size() - i) + 1) {
      ++state[i];
      for(unsigned j = i + 1; j < state.size(); ++j) {
        state[j] = state[i] + (j-i);
      }
      break;
    }

  return state;
}

vector <int> choose::getState() const {
  return state;
}

choose::~choose() {
}

void writeVector(vector <int> v) {
  for(unsigned i = 0; i < v.size(); ++i)
    printf("%d ", v[i]);
  printf("\n");
}

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

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

  choose ch = choose(n, k);
  while(true) {
    writeVector(ch.getState());
    if(ch.hasNext()) 
      ch.next();
    else break;
  }

  fclose(stdin);
  fclose(stdout);
  return 0;
}