III.2 august 2019
Subiectul al III-lea – Exerciţiul 2
| Numim pătrat de dimensiune m al unui tablou bidimensional tabloul obținut din acesta păstrând doar elementele aflate pe primele m linii şi pe primele m coloane ale sale. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural, n (n∈[2,20]), apoi elementele unui tablou bidimensional cu n linii şi n coloane, numere naturale din intervalul [0,104]. Programul determină un pătrat de dimensiune maximă al tabloului citit, cu toate elementele egale, și afișează pe ecran valoarea acestei dimensiuni. Exemplu: pentru n=5 și tabloul alăturat, se afişează pe ecran 3. |

#include <iostream>
using namespace std;
int main()
{
int a[21][21],i,j,n,m,ok=0; // Declararea variabilelor
cin>>n; //Citirea numărului de linii și de coloane ale tabloului bidimensional a
Parcurgerea și citirea elementelor tabloului bidimensionala
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
Conform cerinței trebuie găsit un tablou bidimensional, inclus în tabloul a, care are următoarele proprietăți:
- tabloul bidimensional are m linii și m coloane (m<=n)
- elementul din colțul stânga sus coincide cu a[1][1]
- are toate elementele egale
Am parcurs cu ajutorul variabilei m diagonala principală a tabloului a. Pentru fiecare element de pe diagonală am verificat următoarele:
- toate elementele de pe linia k cuprinse între pozițiile 1 și k (1<=j<=k) să fie egale cu a[1][1]
- toate elementele de pe coloana k cuprinse între pozițiile 1 și k (1<=i<=k) să fie egale cu a[1][1]
Variabila ok care inițial este egală cu 0 își va schimba valoare în 1 în momentul în care nu sunt toate elementele mai sus menționate egale cu a[1][1].
m=1;
while(ok==0 && m<=n) { m++; for(i=m;i>=1;i–)
if(a[i][m]!=a[1][1]) ok=1;
for(j=m;j>=1;j–)
if(a[m][j]!=a[1][1]) ok=1;
}

În urma finalizării instrucțiunii while programul va afișa variabila m dacă variabila ok este egală cu 1.
Dacă variabila ok este egală cu 0 înseamnă că toate elementele tabloului bidimensional sunt egale și terminarea instrucțiunii while a presupus că m=n+1 (m<=n) de aceea va afișa m-1.
if(ok!=0) m=m-1;
cout<<m;
#include <iostream>
using namespace std;
int main()
{
int a[21][21],i,j,n,m,ok=0;
cin>>n;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) cin>>a[i][j];
m=1;
while(ok==0 && m<=n) { m++; for(i=m;i>=1;i--)
if(a[i][m]!=a[1][1]) ok=1;
for(j=m;j>=1;j--)
if(a[m][j]!=a[1][1]) ok=1;
}
if(ok!=0) m=m-1;
cout<<m;
return 0;
}