1378 - Flori2

From Bitnami MediaWiki

Enunț[edit | edit source]

Fetiţele din grupa mare de la grădiniţă culeg flori şi vor să împletească coroniţe pentru festivitatea de premiere. În grădină sunt mai multe tipuri de flori. Fiecare dintre cele n fetiţe culege un buchet având acelaşi număr de flori, însă nu neapărat de acelaşi tip. Pentru a împleti coroniţele fetiţele se împart în grupe. O fetiţă se poate ataşa unui grup numai dacă are cel puţin o floare de acelaşi tip cu cel puţin o altă fetiţă din grupul respectiv.

Cerința[edit | edit source]

Fiind dat un număr natural n reprezentând numărul fetiţelor şi numărul natural m reprezentând numărul de flori dintr-un buchet, să se determine grupele care se formează.

Date de intrare[edit | edit source]

Fişierul de intrare flori2in.txt conţine pe prima linie, separate printr-un spaţiu, numerele naturale n şi m, reprezentând numărul de fetiţe şi respectiv numărul de flori din fiecare buchet. Fiecare dintre următoarele n linii conţine, pentru fiecare fetiţă, câte m valori separate prin câte un spaţiu reprezentând tipurile de flori culese.

Date de ieșire[edit | edit source]

Fişierul de ieşire flori2out.txt va conţine pe fiecare linie câte o grupă formată din numerele de ordine ale fetiţelor separate prin câte un spaţiu, în ordine crescătoare, ca în exemplu.

Restricții și precizări[edit | edit source]

  • 1 ⩽ n ⩽ 150
  • 1 ⩽ m ⩽ 100
  • Tipul unei flori este un număr întreg din intervalul [0,100].
  • Într-o grupă numerele de ordine ale fetiţelor trebuie date în ordine strict crescătoare.
  • În fişierul de ieşire grupele vor fi afişate în ordinea crescătoare a numărului de ordine al primei fetiţe din grupă.

Exemplul 1[edit | edit source]

Intrare
flori2in.txt
5 4
1 2 3 4
5 6 9 6
1 1 1 1
2 4 4 3
7 7 7 7
Ieșire
Datele de intrare corespund restricțiilor impuse
flori2out.txt
1 3 4
2
5

Explicație[edit | edit source]

Fetiţele 1 şi 3 au cules amândouă flori de tipul 1, iar fetiţele 1 şi 4 au cules amândouă flori de tipurile 2, 3 şi 4, deci toate cele trei fetiţe (1, 3, 4) se vor afla în aceiaşi grupă. Fetiţele 2 şi 5 vor forma fiecare câte o grupă deoarece nu au cules flori de acelaşi tip cu nici una dintre celelalte fetiţe.

Exemplul 2[edit | edit source]

Intrare
flori2in.txt
151 4
1 2 3 4
5 6 9 6
1 1 1 1
2 4 4 3
7 7 7 7
Ieșire
Datele de intrare NU corespund restricțiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1378 - Flori2

def valideaza_input(n, m, flori_fete):

   if not (1 <= n <= 150 and 1 <= m <= 100):
       return False
   for lista_flori in flori_fete:
       if len(lista_flori) != m:
           return False
       for tip_floare in lista_flori:
           if not (0 <= tip_floare <= 100):
               return False
   return True


def citeste_date_intrare():

   with open("flori2in.txt", "r") as file:
       n, m = map(int, file.readline().split())
       flori_fete = [list(map(int, file.readline().split())) for _ in range(n)]
   return n, m, flori_fete


def grupare_fete(n, flori_fete):

   grupuri = []
   vizitat = [False] * n
   def dfs(nod, grup):
       vizitat[nod] = True
       grup.append(nod + 1)
       for i in range(n):
           if not vizitat[i] and any(flor in flori_fete[nod] for flor in flori_fete[i]):
               dfs(i, grup)
   for i in range(n):
       if not vizitat[i]:
           grup = []
           dfs(i, grup)
           grupuri.append(sorted(grup))
   return grupuri


def scrie_date_iesire(grupuri):

   with open("flori2out.txt", "w") as file:
       for grup in grupuri:
           file.write(" ".join(map(str, grup)) + "\n")


if __name__ == "__main__":

   n, m, flori_fete = citeste_date_intrare()
   if valideaza_input(n, m, flori_fete):
       print("Datele de intrare corespund restricțiilor impuse")
       rezultat = grupare_fete(n, flori_fete)
       scrie_date_iesire(rezultat)
   else:
       print("Datele de intrare NU corespund restricțiilor impuse")

</syntaxhighlight>