0196 - Aranjamente

De la Universitas MediaWiki

Cerinţa

Se citesc două numere naturale nenule n și k. Să se afişeze, în ordine lexicografică, aranjamentele de câte k elemente ale mulţimii {1,2,..,n}.

Date de intrare

Fişierul de intrare aranjamenteIN.txt conţine pe prima linie numerele n și k, separate printr-un spatiu.

Date de ieşire

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

Restricţii şi precizări

  • 0 < k < n < 9

Exemplul 1

aranjamenteIN.txt

4 2

aranjamenteOUT.txt

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

Exemplul 2

aranjamenteIN.txt

4 5

consola

Nu corespunde restricțiilor

Rezolvare

def verifica_restrictii(n, k):
    if not (0 < k < n < 9):
        print("Nu corespunde restricțiilor.")
        return False
    return True

def genereaza_aranjamente(n, k, aranjament_curent, numere_folosite, fisier_output):
    if len(aranjament_curent) == k:
        fisier_output.write(" ".join(map(str, aranjament_curent)) + "\n")
        return

    for i in range(1, n + 1):
        if i not in numere_folosite:
            numere_folosite.add(i)
            genereaza_aranjamente(n, k, aranjament_curent + [i], numere_folosite, fisier_output)
            numere_folosite.remove(i)

def main():
    # Citirea datelor de intrare din fișier
    with open("aranjamenteIN.txt", "r") as fisier_intrare:
        n, k = map(int, fisier_intrare.readline().split())

    # Verificarea restricțiilor
    if not verifica_restrictii(n, k):
        return

    # Deschiderea fișierului de ieșire pentru scriere
    with open("aranjamenteOUT.txt", "w") as fisier_iesire:
        # Inițializarea listei de elemente și a setului de numere folosite
        aranjament_curent = []
        numere_folosite = set()

        # Generarea aranjamentelor și scrierea lor în fișierul de ieșire
        genereaza_aranjamente(n, k, aranjament_curent, numere_folosite, fisier_iesire)

if __name__ == "__main__":
    main()