Note de curs, probleme algoritmică, 14 octombrie 2013

From Algopedia
Jump to navigationJump to search

În acest curs am discutat despre generarea permutărilor prin backtracking.

Cerința 1

Să se genereze, în ordine lexicografică, toate permutările numerelor de la 1 la N.

#include <stdio.h>

int N;

bool folosit[20];
int permutare[20];

void permutari(int pos) {
	int i;
	if (pos == N) { // folosit[i] == true, oricare ar fi 1 <= i <= N
		for (i = 0; i < N; ++i) {
			printf("%d ", permutare[i]);
		}
		printf("\n");
	} else {
		for(i = 1; i <= N; ++i) {
			if (!folosit[i]) {
				folosit[i] = true;
				permutare[pos] = i;
				permutari(pos + 1);
				folosit[i] = false;
			}
		}
	}
}

int main(void) {
	// citirea datelor
	scanf("%d", &N);

	permutari(0);

	return 0;
}

Cerința 2

Să se genereze cea de-a K-a permutare, în ordine lexicografică, a numerelor de la 1 la N.

#include <stdio.h>

int N, K;

bool folosit[20];
int permutare[20];

int Factorial[20];

void permutari(int pos, int index) {
	int i;
	if (pos == N) { // folosit[i] == true, oricare ar fi 1 <= i <= N
		for (i = 0; i < N; ++i) {
			printf("%d ", permutare[i]);
		}
		printf("\n");
	} else {
		for(i = 1; i <= N; ++i) {
			if (!folosit[i]) {
				if (index < Factorial[N - (pos + 1)]) {
					folosit[i] = true;
					permutare[pos] = i;
					permutari(pos + 1, index);
					folosit[i] = false;
					return;
				} else {
					index -= Factorial[N - (pos + 1)];
				}
			}
		}
	}
}

int main(void) {
	// citirea datelor
	scanf("%d %d", &N, &K);

	int i;
	Factorial[0] = 1;
	for (i = 1; i <= N; ++i) {
		Factorial[i] = Factorial[i - 1] * i;
	}
	permutari(0, K - 1);

	return 0;
}