/* Kasioopea 2014 * http://ksp.mff.cuni.cz/akce/kasiopea/ * * Autorské řešení úlohy 26-K-2: Permutace * * (Pro překlad nastavte svému překladači normu jazyka C na C99 * nebo novější. V gcc se o to postará přepínač -std=c99.) */ #include #include #define Max 10 int N, L; int zakazana[Max]; int p[Max]; // Vzájemně prohodí prvky permutace na pozicích i a j void prohod(int i, int j) { int t = p[i]; p[i] = p[j]; p[j] = t; } // Generuje další permutaci v lexikografickém pořadí // Vrací true, pokud vygenerovaná permutace není poslední bool dalsi_permutace() { int a, b; for (a = N-2; a >= 0; a--) if (p[a] < p[a+1]) break; if (a == -1) return false; for (b = N-1; ; b--) if (p[b] > p[a]) break; prohod(a, b); // Obrátíme posloupnost p[a+1], ..., p[N-1] // Postupně prohazujme první prvek s posledním, druhý s předposledním, atd. for (int i = a+1; i + (N - (a+1)) / 2 < N; i++) prohod(i, N - 1 - (i - (a+1))); return true; } // Ověříme, zda permutace neobsahuje zákazanou podpermutaci bool permutace_ok() { if (L == 0) return true; int i = 0; for (int j = 0; j < L; j++) { while (i < N && p[i] != zakazana[j]) i++; i++; } return i > N; } int main() { scanf("%d%d", &N, &L); for (int l = 0; l < L; l++) scanf("%d", &zakazana[l]); for (int i = 0; i < N; i++) p[i] = i+1; do { if (permutace_ok()) { for (int i = 0; i < N-1; i++) printf("%d ", p[i]); printf("%d\n", p[N-1]); } } while (dalsi_permutace()); return 0; }