Informatică, întrebare adresată de veteranu, 8 ani în urmă

Scrieți un program care citește de la tastatură un număr natural n și construiește o matrice cu 3*n linii și 3*n coloane, împărțită în n*n zone, numerotate de la 1 la n*n, de sus în jos și de la stânga la dreapta. Fiecare zonă ocupă 3 linii și 3 coloane și va conține pe diagonale numărul său de ordine, restul elementelor fiind egale cu 0.

Date de intrare
Programul citetșe de la tastatură numărul n.

Date de ieșire
Programul va afișa pe ecran matricea construită, câte o linie din matrice pe o linie a ecranului, elementele de pe o linie fiind separate prin câte un spațiu.
Exemplu
Intrare

2
Ieșire

1 0 1 2 0 2
0 1 0 0 2 0
1 0 1 2 0 2
3 0 3 4 0 4
0 3 0 0 4 0
3 0 3 4 0 4

indicatii :

Parcurgerea matricii se poate face din 3 în 3 linii și din 3 în 3 coloane.
În fiecare zonă în care ajungem setăm valorile diagonalelor ei cu numărul zonei curente.


SergiuLiogchii: Salut, în ce limbaj de programare trebuie scris programul?
veteranu: c++
SergiuLiogchii: Am o altă soluție dacă te interesează doar că e în Python. Va trebui să transformi codul în C++.
boiustef: ma intereseaza pe mine in python... posteaza..
boiustef: vad ca lui Veteranu nu prea i-a placut varianta mea...
SergiuLiogchii: Boiustef mulțumesc mult pentru interesul tău! Am analizat soluția ta și am constatat că e mult mai bună și ușor de înțeles, de aia nu cred că are rost să postez soluția mea. Însă aș vrea să perfecționăm soluția ta și să îți propun ca, după ce iei numărul n din input, să creezi o matrice din zerouri cu dimensiunea laturilor egală cu 3*n+1 (1 însemnând rândul i[0] și coloana j[0] care nu vor fi afișate la final).
SergiuLiogchii: Am să postez cam cum ar trebui să arate soluția ta în Python, în comentariu la răspunsul tău. Felicitări pentru algoritmul de parcurgere a matricii și atribuire a numărului zonei pe diagonale. E superb!

Răspunsuri la întrebare

Răspuns de boiustef
4

Răspuns:

#include <iostream>

using namespace std;

int n,a,b,i,j,zona,m[61][61];

int main()

{

   cin >> n;

   for (a=0; a<n; a++)

   {

       i=3*a;

       for (b=0; b<n; b++)

       {

           ++zona; j=3*b;

           m[i+1][j+1]=m[i+1][j+3]=m[i+3][j+1]=m[i+3][j+3]=m[i+2][j+2]=zona;

       }

   }

   cout << " matricea generata: \n";

   for (i=1; i<=3*n; i++)

   {

       for (j=1; j<=3*n; j++)

           cout << m[i][j] << " ";

       cout << "\n";

   }

}

Explicație:


boiustef: eu nu am initializat in zerouri matricea, deaoarece declarand-o global, asta se face de la sine in c++...
SergiuLiogchii: Din păcate spațiile au dispărut după ce am postat comentariul iar Python e un limbaj bazat pe indentare. Dar cred că îți dai seama unde și cât spațiu trebuie să lași sub fiecare "for". Cât despre matrice, tu o declari global însă tu o și hardcodezi la 61 rânduri și coloane din câte văd în codul tău.
SergiuLiogchii: Inițializarea matricei am făcut-o într-un singur rând dar există și o versiune mai lungă un pic dar mai clară. Mai întâi se inițializează o matrice goală după care se adaugă (cu metoda ”append”) zerourile (vezi mai jos). Sunt și eu începător în Python și mi se pare un limbaj superb!

array = []
for i in range(0, n * 3 + 1):
array.append([0] * (n * 3 + 1))
SergiuLiogchii: Și afișarea matricei se poate prescurta, în doar 2 linii de cod, cu aceeași tehnică (nested generator) ca și inițializarea matricei. Deci ultimele 4 rânduri din codul meu inițial ar putea fi scrise astfel:

for i in range(1, n * 3 + 1):
print(' '.join([str(array[i][j]) for j in range(1, n * 3 + 1)]))
boiustef: da, simpatic e in python .......
SergiuLiogchii: Da, e foarte simpatic și simplu în același timp limbajul Python :) Deci am ajuns la codul perfect pentru problema de mai sus. E același algoritm ca și al tău doar că matricea se generează exact de n*3 rânduri și coloane, fără cea în plus. Postez în comentariul următor. Sunt doar 11 rânduri de cod :)
SergiuLiogchii: n = int(input('n = '))
array = [[0] * (n * 3) for i in range(n * 3)]
zona = 0
for a in range(0, n):
i = 3 * a
for b in range(0, n):
zona += 1
j = 3 * b
array[i][j] = array[i][j+2] = array[i+2][j] = array[i+2][j+2] = array[i+1][j+1] = zona
for row in array:
print(' '.join([str(i) for i in row]))
boiustef: super... lipsesc numai identările... dar eu stiu locul lor :))) mersi
boiustef: indentările...
SergiuLiogchii: Da, din păcate intentările au fost tratate ca spații libere și au fost șterse automat când am adăugat comentariile. Mulțumesc și eu pentru idei și colaborare. Ți-am trimis o invitație de adăugare la prieteni :)
Alte întrebări interesante