3912 - PermPrimeVec
Cerința
Se dă o mulțime cu n elemente, numere naturale. Afișați în ordine lexicografică toate permutările mulțimii date în care nu există două elemente prime alăturate.
Date de intrare
Programul citește de la tastatură numărul n și apoi n numere naturale, reprezentând elementele mulțimii.
Date de ieșire
Programul va afișa pe ecran permutările cerute, câte una pe fiecare rând și având elementele separate prin câte un spaţiu.
Restricții și precizări
- 1 < n ≤ 11
- numărul valorilor prime din șir va fi aproximativ egal cu cel al valorilor neprime
Exemplu 1
- Intrare
5
9 7 1 2 3
- Iesire
2 1 3 9 7
2 1 7 9 3
2 9 3 1 7
2 9 7 1 3
3 1 2 9 7
3 1 7 9 2
3 9 2 1 7
3 9 7 1 2
7 1 2 9 3
7 1 3 9 2
7 9 2 1 3
7 9 3 1 2
Rezolvare
<syntaxhighlight lang="python" line> import itertools
def is_prime(num):
if num < 2: return False for i in range(2, int(num ** 0.5) + 1): if num % i == 0: return False return True
def read_input():
n = int(input().strip()) elements = list(map(int, input().strip().split())) return n, elements
def write_output(permutations):
for perm in permutations: print(" ".join(map(str, perm)))
def has_no_consecutive_primes(perm):
for i in range(len(perm) - 1): if is_prime(perm[i]) and is_prime(perm[i + 1]): return False return True
def generate_permutations(n, elements):
all_permutations = sorted(itertools.permutations(elements)) valid_permutations = [perm for perm in all_permutations if has_no_consecutive_primes(perm)] return valid_permutations
def main():
n, elements = read_input()
if not (1 < n <= 11): raise ValueError("n trebuie să fie între 1 și 11")
if len(elements) != n: raise ValueError("Numărul de elemente trebuie să fie egal cu n.")
permutations = generate_permutations(n, elements) write_output(permutations)
if __name__ == '__main__':
main()
</syntaxhighlight>