3988 - permnk

From Bitnami MediaWiki

Cerința[edit | edit source]

Se dau numerele naturale n si k. Sa se genereze in ordine lexicografică toate permutările mulțimii {1,2,...,n} cu proprietatea că diferența în modul dintre oricare două numere alăturate din permutare este de cel mult k.

Date de intrare[edit | edit source]

Programul citește de pe prima linie numărul n, iar de pe a doua linie numărul k.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran, pe câte o linie, în ordine lexicografică, permutările cerute.

Restricții și precizări[edit | edit source]

  • 1 ≤ k ≤ n ≤ 9

Exemplul 1[edit | edit source]

Intrare

4
2

Ieșire

1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
2 1 3 4
2 4 3 1
3 1 2 4
3 4 2 1
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1

Explicație[edit | edit source]

Lipsesc permutările în care 1 și 4 sunt alăturate, deoarece diferența lor în modul este mai mare decât 2.

Exemplul 2[edit | edit source]

Intrare

5
7

consola

Restricții neîndeplinite. Asigurați-vă că 
1 <= k <= n <= 9.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def este_permutare_valida(permutare, k):

   for i in range(1, len(permutare)):
       if abs(permutare[i] - permutare[i-1]) > k:
           return False
   return True

def genereaza_permutari(n, k, permutare_curenta):

   if len(permutare_curenta) == n:
       if este_permutare_valida(permutare_curenta, k):
           print(" ".join(map(str, permutare_curenta)))
       return
   for numar in range(1, n + 1):
       if numar not in permutare_curenta:
           genereaza_permutari(n, k, permutare_curenta + [numar])

def verifica_restrictii(n, k):

   return 1 <= k <= n <= 9

if __name__ == "__main__":

   n = int(input("Introduceți n: "))
   k = int(input("Introduceți k: "))
   if verifica_restrictii(n, k):
       genereaza_permutari(n, k, [])
   else:
       print("Restricții neîndeplinite. Asigurați-vă că 1 <= k <= n <= 9.")

</syntaxhighlight>