3689 - 2gen

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 n și m numere naturale. Afișați în ordine lexicografică toate șirurile de lungime m care conțin numere de la 1 la n și fiecare valoare apare de maxim două ori.

Date de intrare

Fișierul de intrare 2genIN.txt conține pe prima linie numerele n și m separate prin spațiu.

Date de ieșire

Fișierul de ieșire 2genOUT.txt va conține câte o soluție pe linie. Numerele de pe aceeași linie se separă prin spații. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Nu corespunde restricțiilor".

Restricții și precizări

  • 1 ≤ n ≤ 6
  • 1 ≤ m ≤ 6

Exemplul 1

2genIN.txt

4 3

2genOUT.txt

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

Exemplul 2

2genIN.txt

7 7 

consola

Nu corespunde restricțiilor

Rezolvare

def genereaza_siruri(n, m):
    def backtracking(sir_partial):
        if len(sir_partial) == m:
            solutii.append(sir_partial.copy())
            return

        for numar in range(1, n + 1):
            if folosit[numar] < 2:
                sir_partial.append(numar)
                folosit[numar] += 1

                backtracking(sir_partial)

                sir_partial.pop()
                folosit[numar] -= 1

    solutii = []
    folosit = {numar: 0 for numar in range(1, n + 1)}
    backtracking([])

    return solutii


def main():
    # Citire date de intrare
    with open("2genIN.txt", "r") as fisier_intrare:
        n, m = map(int, fisier_intrare.readline().split())

    # Verificare restricții
    if not (1 <= n <= 6 and 1 <= m <= 6):
        print("Nu corespunde restricțiilor")
        return

    # Generare șiruri
    siruri = genereaza_siruri(n, m)

    # Scriere rezultate în fișierul de ieșire
    with open("2genOUT.txt", "w") as fisier_iesire:
        if siruri:
            for sir in siruri:
                fisier_iesire.write(" ".join(map(str, sir)) + "\n")
        else:
            fisier_iesire.write("Nu corespunde restricțiilor\n")


if __name__ == "__main__":
    main()