3942 - Fazan

From Bitnami MediaWiki
Revision as of 17:55, 26 December 2023 by 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...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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.

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.

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.

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

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

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

def este_valid(ultim_cuvant, cuvant):

    # Verifica daca ultimele doua litere ale cuvantului 'ultim_cuvant'

    # sunt identice cu primele doua litere ale cuvantului 'cuvant'.

    return ultim_cuvant[-2:] == cuvant[:2]

def backtracking(alese, cuvinte, solutie_parciala, rezultate):

    # Realizeaza algoritmul de backtracking pentru formarea șirului de cuvinte

    # de lungime 'alese' care respectă regula jocului Fazan.

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

# Citire date de intrare

n, m = map(int, input().split())

cuvinte = input().split()

# Apelare funcție pentru afișare rezultate

afiseaza_alegeri(cuvinte, m)