0572 - Arma
Cerinţa[edit | edit source]
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 | edit source]
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 | edit source]
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 | edit source]
- 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 | edit source]
- 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 | edit source]
- 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 | edit source]
<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 | edit source]
- 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.