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; }