Cod sursa(job #1478259)

Utilizator alexandru.huleaAlexandru Hulea alexandru.hulea Data 28 august 2015 12:09:15
Problema Generare de permutari Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <vector>

using namespace std;

bool generateNextPermutation(vector<int>& currentPermutation) {
	int first = -1;
	for (int i = currentPermutation.size() - 1; i > 0; i--) {
		if (currentPermutation[i] > currentPermutation[i - 1]) {
			first = i - 1; 
			break;
		}
	}
	if (first == -1)
		return false;
	
	int second = -1;
	for (int i =  currentPermutation.size() - 1; i > first; i--) {
		if (currentPermutation[i] > currentPermutation[first]) {
			second = i;
			break;
		}
	}

	int aux = currentPermutation[first];
	currentPermutation[first] = currentPermutation[second];
	currentPermutation[second] = aux;

	int reverseSize = currentPermutation.size() - first - 1;
	int size = currentPermutation.size();
	for (int i = 0; i < reverseSize / 2; i++) {
		int aux2 = currentPermutation[first + 1 + i];
		currentPermutation[first + 1 + i] = currentPermutation[size - 1 - i];
		currentPermutation[size - 1 - i] = aux2;
	}
	return true;
}

int main() {

	freopen("permutari.in", "r", stdin);
	freopen("permutari.out", "w", stdout);

	int n;
	scanf("%i", &n);
	vector<int> p;
	for (int i = 0; i < n; i++) {
		p.push_back(i + 1);
		printf("%i ", i + 1);
	}
	while(generateNextPermutation(p)) {
		printf("\n");
		for (int i = 0; i < n; i++) {
			printf("%i ", p[i]);
		}
	}

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