3689 - 2gen
De la Universitas MediaWiki
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()