4014 - Rearanjare Sir

From Bitnami MediaWiki
Revision as of 19:46, 2 June 2024 by Benzar Ioan (talk | contribs) (Pagină nouă: == Cerința == Într-un depozit, mărfurile sunt aranjate pe rafturi sub formă de șiruri de caractere. Mărfurile trebuie rearanjate astfel încât fiecare caracter să fie adiacent în șirul rearanjat doar dacă exista o cale în graf între cele două caractere inițial. Să se determine o rearanjare validă a șirului de caractere pe baza conexiunilor date. == Date de intrare == Programul citește de la tastatură: Un șir de caractere s reprezentând mărfurile pe raf...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerința

Într-un depozit, mărfurile sunt aranjate pe rafturi sub formă de șiruri de caractere. Mărfurile trebuie rearanjate astfel încât fiecare caracter să fie adiacent în șirul rearanjat doar dacă exista o cale în graf între cele două caractere inițial. Să se determine o rearanjare validă a șirului de caractere pe baza conexiunilor date.

Date de intrare

Programul citește de la tastatură:

Un șir de caractere s reprezentând mărfurile pe rafturi. Un număr întreg m reprezentând numărul de conexiuni între caractere. O listă de m perechi de caractere reprezentând conexiunile din graf.

Date de ieșire

Pe ecran se va afișa un șir de caractere rearanjat conform conexiunilor din graf. Dacă nu există nicio rearanjare validă, se va afișa mesajul "Rearanjare imposibilă".

Restricții și precizări

  • 1 ⩽ lungime sir s ⩽ 100
  • 1 ⩽ m ⩽ 100
  • Toate caracterele din sirul 's' sunt distincte.

Exemplu 1

Intrare

abc
2
a b
b c

Iesire

cba

Exemplu 2

Intrare

abcdef
3
a b
c d
e f

Iesire

Rearanjare imposibilă

Rezolvare

<syntaxhighlight lang="python" line> from collections import defaultdict, deque

def citeste_date():

   try:
       s = input("Introduceți șirul de caractere: ")
       m = int(input("Introduceți numărul de conexiuni: "))
       conexiuni = []
       for _ in range(m):
           conexiune = input().strip().split()
           conexiuni.append(conexiune)
       return s, m, conexiuni
   except ValueError:
       return None, None, None

def construieste_graf(s, conexiuni):

   graf = defaultdict(list)
   for u, v in conexiuni:
       graf[u].append(v)
       graf[v].append(u)
   return graf

def bfs(graf, start, vizitat):

   coada = deque([start])
   componenta = []
   vizitat.add(start)
   
   while coada:
       nod = coada.popleft()
       componenta.append(nod)
       for vecin in graf[nod]:
           if vecin not in vizitat:
               vizitat.add(vecin)
               coada.append(vecin)
   
   return componenta

def rearanjeaza_caractere(s, conexiuni):

   graf = construieste_graf(s, conexiuni)
   vizitat = set()
   componente = []
   
   for caracter in s:
       if caracter not in vizitat:
           componenta = bfs(graf, caracter, vizitat)
           componente.append(componenta)
   
   rezultat = []
   for componenta in componente:
       if len(componenta) == 1:
           rezultat.append(componenta[0])
       else:
           sub_sir = .join(componenta)
           for caracter in s:
               if caracter in sub_sir:
                   sub_sir = sub_sir.replace(caracter, )
                   sub_sir = caracter + sub_sir
           rezultat.append(sub_sir)
   
   rearanjat = .join(rezultat)
   
   if sorted(rearanjat) != sorted(s):
       return "Rearanjare imposibilă"
   return rearanjat

def main():

   s, m, conexiuni = citeste_date()
   
   if s is None or m is None or conexiuni is None:
       print("Datele de intrare nu corespund restricțiilor impuse.")
       return
   
   rezultat = rearanjeaza_caractere(s, conexiuni)
   print(rezultat)

if __name__ == "__main__":

   main()

</syntaxhighlight>