Pagini recente » Cod sursa (job #3005137) | Cod sursa (job #478504) | Cod sursa (job #1119703) | Cod sursa (job #3156541) | Cod sursa (job #1756035)
#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;
}