1008 - Spirala 1

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Se dau n numere naturale, un n este un pătrat perfect. Să se construiască în memorie o matrice pătratică cu toate cele n numere, în spirală, în sens invers acelor de ceas astfel: pe prima coloană, începând cu linia 1, se vor trece primele elemente din şir (de sus în jos), apoi pe ultima linie, începând de la prima coloană până la ultima (de la stânga la dreapta), apoi pe ultima coloană, de la ultima linie la prima (de jos în sus), apoi pe prima linie, de la ultima coloană la prima (de la dreapta la stânga) şamd.

Date de intrare[edit | edit source]

Fișierul de intrare spirala1.in conține pe prima linie numărul n, iar pe următoarea linie cele n numere.

Date de ieşire[edit | edit source]

Dacă datele sunt introduse corect,în fişierul de ieşire spirala1.out se va afișa :"Datele sunt introduse corect.",apoi pe un rând va conţine matricea construită, câte o linie a matricei pe o linie a fişierului, elementele fiecărei linii fiind separate prin exact un spaţiu.În cazul contrar,se va afișa pe ecran "Datele nu corespund restricțiilor impuse.".

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

  • 1 ⩽ n ⩽ 10000
  • numerele date vor fi mai mici decât 1000

Exemplu[edit | edit source]

spirala1.in
9
2 6 7 3 7 1 7 1 5
spirala1.out
Datele sunt introduse corect.
2 1 7
6 5 1
7 3 7

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

def validare(n: int, lst: list[int]) -> bool:

   if not (1 <= n <= 10000):
       return False
   if any(num >= 1000 for num in lst):
       return False
   if int(n ** 0.5) ** 2 != n:
       return False
   return True


def construieste_matrice_spirala(n: int, lst: list[int]) -> list[list[int]]:

   n = int(n ** 0.5)
   matrice = [[0] * n for _ in range(n)]
   for k in range(1, (n + 1) // 2 + 1):
       for i in range(k - 1, n - k + 1):
           matrice[i][k - 1] = lst.pop(0)
       for j in range(k, n - k + 1):
           matrice[n - k][j] = lst.pop(0)
       for i in range(n - k - 1, k - 2, -1):
           matrice[i][n - k] = lst.pop(0)
       for j in range(n - k - 1, k - 1, -1):
           matrice[k - 1][j] = lst.pop(0)
   return matrice


if __name__ == "__main__":

   with open("spirala1.in", "r") as fin:
       n = int(fin.readline().strip())
       lst = list(map(int, fin.readline().split()))
   if validare(n, lst):
       matrice = construieste_matrice_spirala(n, lst)
       with open("spirala1.out", "w") as fout:
           fout.write("Datele sunt introduse corect.\n")
           for linie in matrice:
               fout.write(" ".join(map(str, linie)) + "\n")
   else:
       with open("spirala1.out", "w") as fout:
          fout.write("Datele nu corespund restricțiilor impuse.")


</syntaxhighlight>

Explicație rezolvare[edit | edit source]

Acest cod citește datele de intrare din fișierul "spirala1.in" si construiește o matrice pătratică cu toate cele n numere, în spirală, în sens invers acelor de ceas.
Mai exact, citim numarul "n" , care reprezintă numarul de elemente din matrice, iar apoi construim o matrice de dimensiune "n x n" cu ajutorul unui for loop care trece de la exteriorul spre interiorul matricei. În interiorul loop-ului for, se citesc elementele matricei în funcție de poziția curentă a loop-ului si pozițiile pe care trebuie sa le aibă fiecare element in matrice. Ulterior, matricea construită este scrisă in fișierul "spirala1.out".