0196 - Aranjamente

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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()