0205 - Shuffle

From Bitnami MediaWiki

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>