0599 - Covoare

From Bitnami MediaWiki

Cerința[edit | edit source]

Se consideră o încăpere de lungime m și lățime n împărțită în n*m zone pătrate, sub forma unei matrice cu n linii și m coloane. Încăperea este acoperită în totalitate cu p covoare de diferite dimensiuni și culori astfel încât acestea nu se suprapun și încăperea este acoperită în totalitate. Mai mult fiecare zonă pătrată a încăperii este acoperită cu un singur covor.

Gigel, administratorul clădirii, este responsabil cu spălarea covoarelor. Astfel el a notat, în ordine, dimensiunile și culoarea fiecărui covor, în ordine, de sus în jos și de la stânga la dreapta. Covoarele au fost scoase și spălate, dar acum Gigel vă cere ajutorul.

Cunoscând dimensiunile încăperii, numărul de covoare precum și dimensiunile și culoarea fiecărui covor, să se refacă așezarea inițială a acestora.

Date de intrare[edit | edit source]

Fișierul de intrare covoare.in conține pe prima linie numerele n m p, iar pe a următoarele p linii câte trei numere a b c reprezentând lungimea, lățimea și culoarea fiecărui covor.

Date de ieșire[edit | edit source]

Fișierul de ieșire covoare.out va conține o matrice A cu n linii și m coloane, A[i][j] reprezentând culoarea covorului care acoperă zona i j. Fiecare linie a matricei va fi scrisă pe o linie a fișierului, elementele unei linii fiind separate prin exact un spațiu.

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

  • 1 ≤ n, m ≤ 100
  • covoarele trebuie așezate în ordinea dată, și nu pot fi rotite
  • culoarea unui covor este un număr natural nenul

Exemplu:[edit | edit source]

covoare.in

5 6 8
3 2 2
1 1 1
2 3 2
1 1 4
4 2 3
2 2 1
2 1 1
2 1 3

covoare.out

2 2 2 1 2 2
2 2 2 4 2 2
3 3 3 3 2 2
3 3 3 3 1 1
1 1 3 3 1 1

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3"> def read_input(n, m, p):

   carpets = []
   for _ in range(p):
       a, b, c = map(int, input().split())
       carpets.append((a, b, c))
   return carpets

def is_valid_placement(carpets, n, m):

   used_area = [[False for _ in range(m)] for _ in range(n)]
   for a, b, _ in carpets:
       for i in range(n - a + 1):
           for j in range(m - b + 1):
               if used_area[i][j]:
                   return False
               for x in range(a):
                   for y in range(b):
                       used_area[i + x][j + y] = True
   return True

def place_carpets(carpets, n, m):

   """Arranges the carpets on the floor."""
   floor = [[0 for _ in range(m)] for _ in range(n)]
   for a, b, c in carpets:
       for i in range(n - a + 1):
           for j in range(m - b + 1):
               if not used_area[i][j]:
                   for x in range(a):
                       for y in range(b):
                           floor[i + x][j + y] = c
                           used_area[i + x][j + y] = True
                   break
   return floor

def print_floor(floor, n, m):

   for i in range(n):
       for j in range(m):
           print(floor[i][j], end=" ")
       print()

def main():

   n, m, p = map(int, input().split())
   carpets = read_input(n, m, p)
   if not is_valid_placement(carpets, n, m):
       print("IMPOSIBIL")
       return
   floor = place_carpets(carpets, n, m)
   print_floor(floor, n, m)

if __name__ == "__main__":

   main()

</syntaxhighlight>