0572 - Arma: Difference between revisions
Pagină nouă: == Cerinţa == 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... |
No edit summary |
||
Line 14: | Line 14: | ||
* substanțele din care sunt create cărămizile sunt identificate prin numere naturale nenule mai mici decât '''1000''' | * 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 | * dacă la o anumită tragere nu există în zid cărămizi de tipul utilizat la acea tragere, zidul rămâne nemodificat | ||
== Exemplu == | == Exemplu 1 == | ||
; Intrare | ; 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 | ; 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 == | |||
; 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 == | == Rezolvare == | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
def validare(n, m, k, zid, trageri): | |||
n, m, k = | if not 1 <= n <= 100 or not 1 <= m <= 100 or not 1 <= k <= 100: | ||
zid = | 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()) | |||
for | 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) | |||
for | print(message) | ||
for i in range(n | if not valid: | ||
return | |||
for tragere in trageri: | |||
for i in range(n): | |||
for j in range(m): | for j in range(m): | ||
if zid[i][j] == tragere: | |||
if zid[i][j] == 0 and zid[i-1][j] != 0: | 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> | </syntaxhighlight> |
Latest revision as of 16:30, 12 December 2023
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.