0205 - Shuffle
Cerinţa[edit | edit source]
Se citeşte un număr natural nenul n
şi o permutare a mulţimii M={1,2,..,n}
. Să se afişeze, în ordine lexicografică, toate permutările mulţimii M care nu conţin elemente alăturate care au fost alăturate şi în permutarea dată.
Date de intrare[edit | edit source]
Fişierul de intrare shuffleIN.txt
conţine pe prima linie numărul n
, iar pe a doua linie n
valori distincte cuprinse între 1
și n
, separate prin câte un spațiu, reprezentând permutarea dată.
Date de ieşire[edit | edit source]
Fişierul de ieşire shuffleOUT.txt
va conţine pe fiecare linie elementele unei permutări, separate prin câte un spaţiu.
Restricţii şi precizări[edit | edit source]
0 < n < 9
- dacă nu există soluţii se va afişa pe prima linie a fişierului de ieşire mesajul
nu exista
Exemplul 1:[edit | edit source]
shuffleIN.txt
4 2 3 1 4
shuffleOUT.txt
1 2 4 3 3 4 2 1
Exemplul 2:[edit | edit source]
shuffleIN.txt
11 2 3 1 4
shuffleOUT.txt
Datele nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def citire():
with open("shuffleIN.txt", "r") as input_file: n = int(input_file.readline().strip()) v = [0] + list(map(int, input_file.readline().split())) return n, v
def prim(num):
if num < 2: return False if num % 2 == 0 and num != 2: return False for i in range(3, int(num**0.5) + 1, 2): if num % i == 0: return False return True
def sortare(n, v):
for i in range(1, n): for j in range(i + 1, n + 1): if not prim(v[i]) and not prim(v[j]) and v[i] > v[j]: v[i], v[j] = v[j], v[i]
def puncte_fixe(n, v):
x = [0] * (n + 1) for i in range(1, n + 1): if prim(v[i]): x[i] = i return x
def afisare(n, v, x, output_file):
result = [v[x[i]] for i in range(1, n + 1) if x[i] != 0] output_file.write(" ".join(map(str, result)) + "\n")
def valid(k, x):
for i in range(1, k): if x[i] == x[k]: return False return True
def backtracking(k, n, v, x, output_file):
if k > n: afisare(n, v, x, output_file) else: if prim(v[k]): backtracking(k + 1, n, v, x, output_file) else: for i in range(1, n + 1): if not prim(v[i]): x[k] = i if valid(k, x): backtracking(k + 1, n, v, x, output_file)
def verifica_restrictii(n):
if 0 < n < 9: return True else: with open("shuffleOUT.txt", "w") as output_file: output_file.write("Datele nu corespund restrictiilor impuse\n") return False
def main():
n, v = citire()
if verifica_restrictii(n): sortare(n, v) x = puncte_fixe(n, v)
with open("shuffleOUT.txt", "w") as output_file: backtracking(1, n, v, x, output_file)
if __name__ == "__main__":
main()
</syntaxhighlight>