0572 - Arma

From Bitnami MediaWiki
Revision as of 16:30, 12 December 2023 by Ghisa Catalin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerinţa[edit]

Capitala imperiului este protejată de un zid de formă dreptunghiulară formată din n*m cărămizi dispuse pe n linii și m coloane, linia 1 fiind cea mai de sus, iar linia n fiind cea mai de jos. Fiecare cărămidă este alcătuită dintr-o substanță identificată printr-un număr natural nenul.

Cuceritorul Gigel are la dispoziție o armă specială, care poate fi programată să distrugă toate cărămizile din zid care sunt formate din aceeași substanță, cunoscută, la o singură tragere. După fiecare tragere, toate cărămizile care sunt situate deasupra celor distruse cad, până ajung pe o cărămidă din zid, sau la baza acestuia.

Solicitarea lui Gigel este să determinați structura zidului după un număr dat de trageri, k.

Date de intrare[edit]

Programul citește de la tastatură numerele n m k, iar apoi n șiruri cu câte m numere naturale, reprezentând cărămizile de pe fiecare linie. Apoi se vor citi k numere naturale, reprezentând, în ordine, substanța din care sunt alcătuite cărămizile afectate de tragerea curentă.

Date de ieșire[edit]

Programul va afișa pe ecran n șiruri cu câte m numere naturale, separate prin exact un spațiu, reprezentând configurația zidului după cele k trageri. Cărămizile distruse vor fi precizate prin numărul 0.

Restricţii şi precizări[edit]

  • 1 ⩽ n, m ⩽ 100
  • 1 ⩽ k ⩽ 100
  • substanțele din care sunt create cărămizile sunt identificate prin numere naturale nenule mai mici decât 1000
  • dacă la o anumită tragere nu există în zid cărămizi de tipul utilizat la acea tragere, zidul rămâne nemodificat

Exemplu 1[edit]

Intrare
4 5 3
3 5 4 5 1 
2 1 1 5 3 
1 1 5 5 1 
5 5 1 4 3
1 5 1
Ieșire
Datele de intrare corespund restrictiilor impuse
0 0 0 0 0 
0 0 0 0 0 
3 0 0 0 3 
2 0 4 4 3

Exemplu 2[edit]

Intrare
4 5 101
3 5 4 5 1 
2 1 1 5 3 
1 1 5 5 1 
5 5 1 4 3
1 5 1
Ieșire
Datele de intrare nu corespund restrictiilor impuse

Rezolvare[edit]

<syntaxhighlight lang="python" line> def validare(n, m, k, zid, trageri):

   if not 1 <= n <= 100 or not 1 <= m <= 100 or not 1 <= k <= 100:
       return False, "Datele de intrare nu corespund restrictiilor impuse"
   for row in zid:
       for z in row:
           if not 1 <= z < 1000:
               return False, "Datele de intrare nu corespund restrictiilor impuse"
   for t in trageri:
       if not 1 <= t < 1000:
           return False, "Datele de intrare nu corespund restrictiilor impuse"
   return True, "Datele de intrare corespund restrictiilor impuse"


def main():

   print("Introduceți numărul de linii, numărul de coloane și numărul de trageri:")
   n, m, k = map(int, input().split())
   print("Introduceți configurația inițială a zidului:")
   zid = [list(map(int, input().split())) for _ in range(n)]
   print("Introduceți substanțele afectate de fiecare tragere:")
   trageri = list(map(int, input().split()))
   valid, message = validare(n, m, k, zid, trageri)
   print(message)
   if not valid:
       return
   for tragere in trageri:
       for i in range(n):
           for j in range(m):
               if zid[i][j] == tragere:
                   zid[i][j] = 0
       for _ in range(n):
           for i in range(n - 1, 0, -1):
               for j in range(m):
                   if zid[i][j] == 0 and zid[i - 1][j] != 0:
                       zid[i][j], zid[i - 1][j] = zid[i - 1][j], zid[i][j]
   print("Configurația finală a zidului este:")
   for linie in zid:
       print(' '.join(map(str, linie)))


if __name__ == "__main__":

   main()

</syntaxhighlight>

Explicatie[edit]

După prima tragere, zidul devine
0 0 0 5 0
3 0 0 5 0
2 5 4 5 3
5 5 5 4 3
După a doua tragere, zidul devine
0 0 0 0 0
0 0 0 0 0
3 0 0 0 3
2 0 4 4 3
A treia tragere nu mai modifică zidul.