3942 - Fazan: Difference between revisions
Andrada378 (talk | contribs) Pagină nouă: '''''<u>Cerința</u>''''' Se dau n cuvinte distincte formate din litere mici și un număr m. Afișați în ordine lexicografică toate șirurile de câte m cuvinte distincte dintre cele date, care respectă regula jocului Fazan. La jocul Fazan o succesiune de două cuvine a și b se consideră corectă dacă ultimele două litere din cuvântul a sunt identice cu primele două din b. De exemplu, cuvintele fazan și anterior sunt corecte în această ordine. <u>'''''Date de... |
Andrada378 (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
== Cerința == | |||
Se dau n cuvinte distincte formate din litere mici și un număr m. Afișați în ordine lexicografică toate șirurile de câte m cuvinte distincte dintre cele date, care respectă regula jocului Fazan. La jocul Fazan o succesiune de două cuvine a și b se consideră corectă dacă ultimele două litere din cuvântul a sunt identice cu primele două din b. De exemplu, cuvintele fazan și anterior sunt corecte în această ordine. | Se dau n cuvinte distincte formate din litere mici și un număr m. Afișați în ordine lexicografică toate șirurile de câte m cuvinte distincte dintre cele date, care respectă regula jocului Fazan. La jocul Fazan o succesiune de două cuvine a și b se consideră corectă dacă ultimele două litere din cuvântul a sunt identice cu primele două din b. De exemplu, cuvintele fazan și anterior sunt corecte în această ordine. | ||
== Date de intrare == | |||
Programul citește de la tastatură numerele n și m, iar apoi n cuvinte, separate prin spații sau scrise pe rânduri separate. | Programul citește de la tastatură numerele n și m, iar apoi n cuvinte, separate prin spații sau scrise pe rânduri separate. | ||
== Date de ieșire == | |||
Programul va afișa pe ecran pe linii separate în ordine lexicografică toate șirurile de câte m cuvinte dintre cele date, care respectă regula jocului Fazan. Cuvintele de pe același rând se vor separa prin câte un spațiu. | Programul va afișa pe ecran pe linii separate în ordine lexicografică toate șirurile de câte m cuvinte dintre cele date, care respectă regula jocului Fazan. Cuvintele de pe același rând se vor separa prin câte un spațiu. | ||
Dacă nu se pot alege m cuvinte care să respecte condiția, atunci se va afișa IMPOSIBIL. | Dacă nu se pot alege m cuvinte care să respecte condiția, atunci se va afișa IMPOSIBIL. | ||
== Restricții și precizări == | |||
1 ≤ m < n ≤ 30 | * 1 ≤ m < n ≤ 30 | ||
* cele n cuvinte sunt formate din litere mici, au lungimea cel puțin 2 și cel mult 20 și sunt distincte. | |||
== Exemplu: == | |||
'''Intrare''' | |||
''''' | |||
11 3 | 11 3 | ||
Line 27: | Line 22: | ||
cosmin nasture repede cosmina alina interactiv ascutit anual incrementare ananas banana | cosmin nasture repede cosmina alina interactiv ascutit anual incrementare ananas banana | ||
Ieșire | '''Ieșire''' | ||
alina nasture repede | alina nasture repede | ||
Line 39: | Line 34: | ||
cosmina nasture repede | cosmina nasture repede | ||
== Rezolvare == | |||
<syntaxhighlight lang="python"> | |||
def este_valid(ultim_cuvant, cuvant): | def este_valid(ultim_cuvant, cuvant): | ||
# Verifică dacă ultimele două litere ale cuvântului 'ultim_cuvant' | |||
# coincid cu primele două litere ale cuvântului 'cuvant'. | |||
return ultim_cuvant[-2:] == cuvant[:2] | |||
def backtracking(alese, cuvinte, solutie_parciala, rezultate): | def backtracking(alese, cuvinte, solutie_parciala, rezultate): | ||
# Algoritmul de backtracking pentru formarea șirului de cuvinte. | |||
if alese == 0: | |||
rezultate.append(solutie_parciala[:]) | |||
return | |||
ultim_cuvant = solutie_parciala[-1] if solutie_parciala else "" | |||
for cuvant in cuvinte: | |||
if cuvant not in solutie_parciala and este_valid(ultim_cuvant, cuvant): | |||
solutie_parciala.append(cuvant) | |||
backtracking(alese - 1, cuvinte, solutie_parciala, rezultate) | |||
solutie_parciala.pop() | |||
def afiseaza_alegeri(cuvinte, m): | def afiseaza_alegeri(cuvinte, m): | ||
# Afișează șirurile de cuvinte de lungime 'm' care respectă regula jocului Fazan. | |||
rezultate = [] | |||
for cuvant in cuvinte: | |||
backtracking(m - 1, cuvinte, [cuvant], rezultate) | |||
rezultate = sorted(rezultate) | |||
if not rezultate: | |||
print("IMPOSIBIL") | |||
else: | |||
for solutie in rezultate: | |||
print(" ".join(solutie)) | |||
# Funcție pentru validarea datelor de intrare | |||
def validate_input(n, m, cuvinte): | |||
if not (1 <= m < n <= 30): | |||
print("Constrângeri neîndeplinite pentru n și m.") | |||
return False | |||
for cuvant in cuvinte: | |||
if not (2 <= len(cuvant) <= 20): | |||
print("Lungimea cuvintelor trebuie să fie între 2 și 20 caractere.") | |||
return False | |||
return True | |||
# Citire date de intrare | |||
n, m = map(int, input().split()) | n, m = map(int, input().split()) | ||
cuvinte = input().split() | cuvinte = input().split() | ||
# Validare date de intrare | |||
if validate_input(n, m, cuvinte): | |||
afiseaza_alegeri(cuvinte, m) | # Apelare funcție pentru afișare rezultate | ||
afiseaza_alegeri(cuvinte, m) | |||
</syntaxhighlight> |
Latest revision as of 11:09, 5 January 2024
Cerința[edit | edit source]
Se dau n cuvinte distincte formate din litere mici și un număr m. Afișați în ordine lexicografică toate șirurile de câte m cuvinte distincte dintre cele date, care respectă regula jocului Fazan. La jocul Fazan o succesiune de două cuvine a și b se consideră corectă dacă ultimele două litere din cuvântul a sunt identice cu primele două din b. De exemplu, cuvintele fazan și anterior sunt corecte în această ordine.
Date de intrare[edit | edit source]
Programul citește de la tastatură numerele n și m, iar apoi n cuvinte, separate prin spații sau scrise pe rânduri separate.
Date de ieșire[edit | edit source]
Programul va afișa pe ecran pe linii separate în ordine lexicografică toate șirurile de câte m cuvinte dintre cele date, care respectă regula jocului Fazan. Cuvintele de pe același rând se vor separa prin câte un spațiu.
Dacă nu se pot alege m cuvinte care să respecte condiția, atunci se va afișa IMPOSIBIL.
Restricții și precizări[edit | edit source]
- 1 ≤ m < n ≤ 30
- cele n cuvinte sunt formate din litere mici, au lungimea cel puțin 2 și cel mult 20 și sunt distincte.
Exemplu:[edit | edit source]
Intrare
11 3
cosmin nasture repede cosmina alina interactiv ascutit anual incrementare ananas banana
Ieșire
alina nasture repede
anual alina nasture
banana nasture repede
cosmin incrementare repede
cosmina nasture repede
Rezolvare[edit | edit source]
<syntaxhighlight lang="python"> def este_valid(ultim_cuvant, cuvant):
# Verifică dacă ultimele două litere ale cuvântului 'ultim_cuvant' # coincid cu primele două litere ale cuvântului 'cuvant'. return ultim_cuvant[-2:] == cuvant[:2]
def backtracking(alese, cuvinte, solutie_parciala, rezultate):
# Algoritmul de backtracking pentru formarea șirului de cuvinte.
if alese == 0: rezultate.append(solutie_parciala[:]) return
ultim_cuvant = solutie_parciala[-1] if solutie_parciala else ""
for cuvant in cuvinte: if cuvant not in solutie_parciala and este_valid(ultim_cuvant, cuvant): solutie_parciala.append(cuvant) backtracking(alese - 1, cuvinte, solutie_parciala, rezultate) solutie_parciala.pop()
def afiseaza_alegeri(cuvinte, m):
# Afișează șirurile de cuvinte de lungime 'm' care respectă regula jocului Fazan.
rezultate = []
for cuvant in cuvinte: backtracking(m - 1, cuvinte, [cuvant], rezultate)
rezultate = sorted(rezultate)
if not rezultate: print("IMPOSIBIL") else: for solutie in rezultate: print(" ".join(solutie))
- Funcție pentru validarea datelor de intrare
def validate_input(n, m, cuvinte):
if not (1 <= m < n <= 30): print("Constrângeri neîndeplinite pentru n și m.") return False for cuvant in cuvinte: if not (2 <= len(cuvant) <= 20): print("Lungimea cuvintelor trebuie să fie între 2 și 20 caractere.") return False return True
- Citire date de intrare
n, m = map(int, input().split()) cuvinte = input().split()
- Validare date de intrare
if validate_input(n, m, cuvinte):
# Apelare funcție pentru afișare rezultate afiseaza_alegeri(cuvinte, m)
</syntaxhighlight>