Cod sursa(job #1756035)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 11 septembrie 2016 17:46:29
Problema Generare de permutari Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <algorithm>
#include <string>
#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <map>
#include <queue>
using namespace std;

#ifdef INFOARENA
#define TEST 0
#else
#define TEST 1
#endif

class Permutations {
 public:
  int Factorial(int n) {
    int result = 1;
    for (int i = 1; i <= n; ++i) {
      result *= i;
    }
    return result;
  }
  Permutations(int len) : len_(len) {
    config_ = vector<int>(len_, 0);
    used_digit_ = vector<bool>(len_ + 1, false);
    perm_count_ = Factorial(len_);
    first_perm_ = true;
  }
  void Generate(int pos) {
    if (pos < 0) {
      return;
    }
    for (int i = config_[pos] + 1; i <= len_; ++i) {
      if (!used_digit_[i]) {
        used_digit_[config_[pos]] = 0;
        config_[pos] = i;
        used_digit_[i] = true;
        return;
      }
    }
    used_digit_[config_[pos]] = false;
    Generate(pos - 1);
    for (int i = 1; i <= len_; ++i) {
      if (!used_digit_[i]) {
        used_digit_[i] = true;
        config_[pos] = i;
        break;
      }
    }
  }
  vector<int> NextPermutation() {
    if (perm_count_) {
      perm_count_--;
      if (first_perm_) {
        // Initialize first permutation
        for (int i = 1; i <= len_; ++i) {
          config_[i - 1] = i;
          used_digit_[i] = true;
        }
        first_perm_ = false;
      } else {
        Generate(len_ - 1);
      }
      return config_;
    }
    return {};
  }
 private:
  int len_;
  int perm_count_;
  bool first_perm_;
  vector<int> config_;
  vector<bool> used_digit_;
};

int main() {
  freopen("permutari.in","r",stdin);
  freopen("permutari.out","w",stdout);
  int n;
  scanf("%d", &n);
  Permutations *perm = new Permutations(n);
  vector<int> next_perm = perm->NextPermutation();
  while (!next_perm.empty()) {
    for (int num : next_perm) {
      printf("%d ", num);
    }
    printf("\n");
    next_perm = perm->NextPermutation();
  }

  return 0;
}