0572 - Arma: Difference between revisions

From Bitnami MediaWiki
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
4 5 3
: 3 5 4 5 1  
3 5 4 5 1  
: 2 1 1 5 3  
2 1 1 5 3  
: 1 1 5 5 1  
1 1 5 5 1  
: 5 5 1 4 3
5 5 1 4 3
: 1 5 1
1 5 1
; Ieșire
; Ieșire
: 0 0 0 0 0  
Datele de intrare corespund restrictiilor impuse
: 0 0 0 0 0  
0 0 0 0 0  
: 3 0 0 0 3  
0 0 0 0 0  
: 2 0 4 4 3
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>
# Citirea datelor de intrare
def validare(n, m, k, zid, trageri):
n, m, k = map(int, input().split())
    if not 1 <= n <= 100 or not 1 <= m <= 100 or not 1 <= k <= 100:
zid = [list(map(int, input().split())) for _ in range(n)]
        return False, "Datele de intrare nu corespund restrictiilor impuse"
trageri = list(map(int, input().split()))
    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"
 


# Parcurgem fiecare tragere
def main():
for tragere in trageri:
    print("Introduceți numărul de linii, numărul de coloane și numărul de trageri:")
     # Parcurgem fiecare cărămidă din zid
     n, m, k = map(int, input().split())
     for i in range(n):
    print("Introduceți configurația inițială a zidului:")
        for j in range(m):
     zid = [list(map(int, input().split())) for _ in range(n)]
            # Dacă cărămida este de tipul curent, o distrugem
    print("Introduceți substanțele afectate de fiecare tragere:")
            if zid[i][j] == tragere:
    trageri = list(map(int, input().split()))
                zid[i][j] = 0
 
    # Simulăm căderea cărămidilor
    valid, message = validare(n, m, k, zid, trageri)
     for _ in range(n):
    print(message)
         for i in range(n-1, 0, -1):
    if not valid:
        return
 
     for tragere in trageri:
         for i in range(n):
             for j in range(m):
             for j in range(m):
                 # Dacă locul de sub o cărămidă este liber, o lăsăm să cadă
                 if zid[i][j] == tragere:
                 if zid[i][j] == 0 and zid[i-1][j] != 0:
                    zid[i][j] = 0
                    zid[i][j], zid[i-1][j] = zid[i-1][j], zid[i][j]
        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)))
 


# Afișăm configurația finală a zidului
if __name__ == "__main__":
for linie in zid:
     main()
     print(' '.join(map(str, linie)))


</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.