0204 - Siruri

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se citesc două numere naturale nenule n și m. Să se determine toate şirurile cu m elemente din mulţimea {1,2,..,n}, ordonate strict crescător, cu proprietatea că oricare două elemente consecutive în şir au diferenţa mai mică sau egală cu cu 2.

Date de intrare[edit | edit source]

Fişierul de intrare siruriIN.txt conţine pe prima linie numerele n și m, separate printr-un spațiu.

Date de ieşire[edit | edit source]

Fişierul de ieşire siruriOUT.txt va conţine pe fiecare linie câte m valori, separate prin câte un spaţiu, reprezentând elementele unui şir. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Nu corespunde restricțiilor".

Restricţii şi precizări[edit | edit source]

  • 1 ≤ m ≤ n ≤ 15
  • şirurile vor fi afişate în ordine lexicografică

Exemplul 1[edit | edit source]

siruriIN.txt

5 3

siruriOUT.txt

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

Exemplul 2[edit | edit source]

siruriIN.txt

8 9

siruriOUT.txt

Nu corespunde restricțiilor

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def genereaza_siruri(n, m, sir_curent, start):

   if len(sir_curent) == m:
       return [sir_curent.copy()]
   siruri = []
   for i in range(start, n + 1):
       if not sir_curent or abs(sir_curent[-1] - i) <= 2:
           sir_curent.append(i)
           siruri.extend(genereaza_siruri(n, m, sir_curent, i + 1))
           sir_curent.pop()
   return siruri

def main():

   with open("siruriIN.txt", "r") as fisier_intrare:
       n, m = map(int, fisier_intrare.readline().split())
   if not (1 <= m <= n <= 15):
       with open("siruriOUT.txt", "w", encoding="utf-8") as fisier_iesire:
           fisier_iesire.write("Nu corespunde restricțiilor\n")
       return
   siruri_generate = genereaza_siruri(n, m, [], 1)
   with open("siruriOUT.txt", "w", encoding="utf-8") as fisier_iesire:
       if not siruri_generate:
           fisier_iesire.write("Nu corespunde restricțiilor\n")
       else:
           for sir in sorted(siruri_generate):
               fisier_iesire.write(" ".join(map(str, sir)) + "\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>