Sunteți pe pagina 1din 15

Lectia nr.

12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui


Prof. Nicu Vlad-Laurențiu

Tablouri bidimensionale patratice


Într-o matrice pătratică numărul de linii= numărul de coloane (n=m).

Într-o matrice pătratică avem:

Diagonala principala
elementele a[i][i], cu i=1,n
sau a[i][i], cu i=0,n-1

Parcurgerea elementelor de pe diagonala principală:

for(int i = 1 ; i <= n ; i ++)


{
// A[i][i]
}

sau

for(int i = 0 ; i < n ; i ++)


{
// A[i][i]
}
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

Diagonala secundara

elementele a[i][n-i+1], i=1,n


sau a[i][n-i-1], i=0,n-1

for(int i = 1 ; i <= n ; i ++)


{
// A[i][n-i+1]
}

sau

for(int i = 0 ; i < n ; i ++)


{
// A[i][n-i-1]
}

Zonele determinate de diagonale:


I.
Pe diagonala principală i=j

int n, A[100][100];
...
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
if (i==j ) { // A[i][j] }

sau

int n, A[100][100];
...
for(int i = 0 ; i < n ; i ++)
for(int j = 0 ; j < n ; j ++)
if (i==j ) { // A[i][j] }

Sub diagonala principala: i>j

int n, A[100][100];
...
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

if (i>j ) { // A[i][j] }

sau

int n, A[100][100];
...
for(int i = 0 ; i < n ; i ++)
for(int j = 0 ; j < n ; j ++)
if (i>j ) { // A[i][j] }

Deasupra diagonalei principale: i<j

int n, A[100][100];
...
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
if (i<j ) { // A[i][j] }

sau

int n, A[100][100];
...
for(int j = 0 ; i < n ; j ++)
for(int i = 0 ; i < n ; i ++)
if (i<j ) { // A[i][j] }

II.
Pe diagonala secundară j+i=n+1 sau j+i=n-1

int n, A[100][100];
...
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
if (i+j==n+1 ) { // A[i][j] }

sau

int n, A[100][100];
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

...
for(int i = 0 ; i < n ; i ++)
for(int j = 0 ; j < n ; j ++)
if (i+j==n-1 ) { // A[i][j] }

Sub diagonala secundara: j+i>n+1 sau j+i>n-1

int n, A[100][100];
...
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
if (i+j > n+1 ) { // A[i][j] }

sau

int n, A[100][100];
...
for(int i = 0 ; i < n ; i ++)
for(int j = 0 ; j < n ; j ++)
if (i+j > n-1 ) { // A[i][j] }

Deasupra diagonalei secundare: j+i>n+1 sau j+i<n-1

int n, A[100][100];
...
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
if (i+j < n+1 ) { // A[i][j] }

sau

int n, A[100][100];
...
for(int i = 0 ; i < n ; i ++)
for(int j = 0 ; j < n ; j ++)
if (i+j < n-1 ) { // A[i][j] }
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

Zonele:
N:
i<j si j+i<n+1

int n, A[100][100];
...
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
if (i<j si j+i<n+1) { // A[i][j] }

sau

i<j si j+i<n-1

int n, A[100][100];
...
for(int i = 0 ; i < n ; i ++)
for(int j = 0 ; j < n ; j ++)
if (i<j si j+i<n-1) { // A[i][j] }

E: i<j si j+i>n+1

int n, A[100][100];
...
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
if (i<j si j+i>n+1) { // A[i][j] }

sau

i<j si j+i>n-1

int n, A[100][100];
...
for(int i = 0 ; i < n ; i ++)
for(int j = 0 ; j < n ; j ++)
if (i<j si j+i>n-1) { // A[i][j] }

S: i>j si j+i>n-1
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

int n, A[100][100];
...
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
if (i>j si j+i>n+1) { // A[i][j] }

sau

i>j si j+i>n-1

int n, A[100][100];
...
for(int i = 0 ; i < n ; i ++)
for(int j = 0 ; j < n ; j ++)
if (i<j si j+i<n-1) { // A[i][j] }

V: i>j si j+i<n+1

int n, A[100][100];
...
for(int i = 1 ; i <= n ; i ++)
for(int j = 1 ; j <= n ; j ++)
if (i>j si j+i<n+1) { // A[i][j] }

sau

i>j si j+i<n-1

int n, A[100][100];
...
for(int i = 0 ; i < n ; i ++)
for(int j = 0 ; j < n ; j ++)
if (i>j si j+i<n-1) { // A[i][j] }
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

Vecinii unui element din matrice


NV N NE
a[i-1][j-1] a[i-1][j] a[i-1][j+1]

V E
a[i][j-1] a[i][j] a[i][j+1]

SV S SE
a[i+1][j-1] a[i+1][j] a[i+1][j+1]

Un element din matrice, în funcție de poziția sa, are 3, 5 sau 8 vecini. Pentru a nu verifica
poziția elementului, se bordează matricea (cu o valoare dependentă de problema care se
rezolvă, se adaugă o linie sus, o linie jos, o coloană la stânga, o coloană la dreapta), astfel
toate elementele vor avea 8 vecini. Deplasarea se va face cu ajutorul a doi vectori care indică
poziția relativă a unui vecin față de elementul a[i][j].

int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,1, 1,1,0,-1,-1,-1};
int k; //afisam vecinii
for (k=0; k<8; k++)
cout<<a[i+dx[k]][y+dy[k]]<<’\n’;

Observație:
În unele probleme ne putem deplasa numai pe linie și pe coloană, vom avea in acest caz
numai 4 vecini (N, E, S, V).

N
a[i-1][j]

V E
a[i][j]
a[i][j-1] a[i][j+1]

S
a[i+1][j]

In acest caz vectorii


int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int k; //afisam vecinii
for (k=0; k<4; k++)
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

cout<<a[i+dx[k]][y+dy[k]]<<’\n’;

Aplicații :
# 779 VeciniPari
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Să se determine câte
elemente din matrice au toți vecinii numere pare.
Solutie:
#include <iostream>
using namespace std;
int a[105][105],n,m,i,j,ct=0,p;
int main()
{
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>a[i][j];

for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i+1][j]%2==0&&a[i-1][j]%2==0&&a[i][j+1]%2==0&&a[i][j-1]%2==0)
ct++;

cout<<ct;
return 0;
}

# 635 Vecini1
Se dă o matrice cu n linii și m coloane și elemente numere naturale. Determinați pentru câte
dintre elementele matricei toți vecinii au valori diferite între ele.
#include <iostream>
#include <fstream>
using namespace std;

ifstream fin("vecini1.in");
ofstream fout("vecini1.out");

const int di[] = {0 , 0, 1 , -1} , dj[] = {1 , -1 , 0 , 0};


Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

int n,m,A[105][105];

int main()
{
fin >> n >> m;
for(int i =1 ; i <= n ; ++i)
for(int j = 1 ; j <= m ; ++j)
fin >> A[i][j];

//pentru a ignora cazurile speciale (prima linie, prima


coloana, etc),
//bordam matricea cu valori diferite, incepand de la
valoare maxim + 1
int p = A[1][1] ;
for(int i =1 ; i <= n ; ++i)
for(int j = 1 ; j <+ m ; ++j)
if(A[i][j] > p)
p = A[i][j];
p ++;
for(int i = 0 ; i <= n + 1 ; i ++)
A[i][0] = p ++, A[i][m + 1] = p ++;
for(int j = 1 ; j <= m ; ++j)
A[0][j] = p ++, A[n + 1][j] = p ++;
int cnt = 0;
// parcurgem matricea si verificam pentru fiecare element
daca are toti vecinii diferiti
for(int i = 1 ; i <= n ; ++i)
for(int j = 1 ; j <= m ; ++j)
{
bool OK = true;
for(int s = 0 ; s < 3 ; s ++)
for(int t = s + 1 ; t < 4 ; t ++)
if(A[i + di[s]][j + dj[s]] == A[i + di[t]][j + dj[t]])
OK = false;
if(OK)
cnt ++;
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

}
fout << cnt << endl;
return 0;
}

Aplicații tablouri bidimensionale patratice


Problemele sunt luate de pe site-ul pbinfo.ro

#313 Diagonale
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Calculaţi diferenţa în
valoare absolută dintre sumele elementelor de pe cele două diagonale.

Solutie:
#include <iostream>
using namespace std;

int n, a[25][25];

int main(){
cin >> n;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
cin >> a[i][j];

int s1 = 0, s2 = 0;
for(int i=1;i<=n;++i)
s1+=a[i][i], s2+=a[i][n-i+1];

if(s1>s2)
cout << s1-s2;
else
cout << s2-s1;
return 0;
}
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

#780 CmmdcSum
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Calculaţi cel mai mare
divizor comun al sumei elementelor de deasupra diagonalei principale și al sumei elementelor
de sub diagonala principală.
Soluție:
#include <iostream>
using namespace std;
int n,a[102][102];

int main()
{
cin >> n;
for(int i = 1 ; i <= n ; ++i)
for(int j = 1 ; j <= n ; ++j)
cin >> a[i][j];

int s = 0, t = 0;

for(int i = 1 ; i <= n ; i ++ )
for(int j =1 ; j <= n ; j ++)
if(i > j)
s += a[i][j];
else
if(i < j)
t += a[i][j];
int r;
while(t !=0)
{
r = s % t;
s = t;
t = r;
}
cout << t;
return 0;
}
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

#1749 Zona4

Considerăm o matrice pătratică cu N linii și N coloane. În această matrice sunt definite 4 zone:

• zona 1, formată din elementele situate strict deasupra


diagonalei principale și strict deasupra diagonalei secundare;
• zona 2, formată din elementele situate strict deasupra
diagonalei principale și strict sub diagonala secundară;
• zona 3, formată din elementele situate strict sub diagonala
principală și strict sub diagonala secundară;
• zona 4, formată din elementele situate strict sub diagonala
principală și strict deasupra diagonalei secundare;

Solutie:
#include <iostream>
#define N 201
using namespace std;
int main()
{
int a[N][N], n,z,i,j,S[5]={0};
cin>>n>>z;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j) cin>>a[i][j];
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
{if(i<j && i+j<n+1) S[1]+=a[i][j];///ZN
if(i>j && i+j>n+1) S[3]+=a[i][j];///ZS
if(i<j && i+j>n+1) S[2]+=a[i][j];///ZE
if(i>j && i+j<n+1) S[4]+=a[i][j];///ZV
}
for(i=1;i<=4;++i)
if(z==i) cout<<S[i];
return 0;
}

#794 Serpuire
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Să se afișeze elementele
prin parcurgerea șerpuită a matricei, începând din elementul de pe prima linie și prima
coloană, ca în exemplu.
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

4
1 3 4 10
2 5 9 11
6 8 12 15
7 13 14 16
Se va afisa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Solutie:
#include <iostream>
using namespace std;
int n,i,j,a[26][26],k;
int main(){
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
for(i=1;i<=n;i++){
if(i%2){
for(k=i,j=1;j<=i;k--,j++)
cout<<a[j][k]<<" ";
}
else{
for(k=i,j=1;j<=i;k--,j++)
cout<<a[k][j]<<" ";
}
}
if(n%2==0)
for(i=2;i<=n;i++) {
if(i%2){
for(k=n,j=i;k>=i;k--,j++)
cout<<a[k][j]<<" ";
}
else{
for(k=n,j=i;k>=i;k--,j++)
cout<<a[j][k]<<" ";
}
}
else
for(i=2;i<=n;i++){
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

if(i%2==0){
for(k=n,j=i;k>=i;k--,j++)
cout<<a[k][j]<<" ";
}
else{
for(k=n,j=i;k>=i;k--,j++)
cout<<a[j][k]<<" ";
}
}
}

#210 Chenar
Scrieţi un program care citeşte numărul natural n şi cele n*n elemente ale tabloului şi apoi
afişează elementele chenarului exterior al tabloului, separate prin câte un spaţiu. Chenarul
este parcurs în sensul acelor de ceasornic începând din colţul său stânga-sus. Chenarul este
format din prima şi ultima linie, prima şi ultima coloană a tabloului.
Solutie:
#include <fstream>
using namespace std;
ifstream fin("chenar.in");
ofstream fout("chenar.out");
int a[105][105],n;
int main(){
fin >> n;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
fin >> a[i][j];
for(int j=1;j<=n;++j)
fout << a[1][j] << " ";
for(int i=2;i<=n;++i)
fout << a[i][n] << " ";
for(int j=n-1;j>=1;--j)
fout << a[n][j] << " ";
for(int i=n-1;i>=2;--i)
fout << a[i][1] << " ";
return 0;
}
Lectia nr. 12 Tablou bidimensional pătratic Centrul de Excelenta Vaslui
Prof. Nicu Vlad-Laurențiu

#211 Spirala
Scrieţi un program care citeşte numărul natural n şi cele n*n elemente ale tabloului şi apoi
afişează pe ecran elementele tabloului, separate prin câte un spaţiu, obţinute prin parcurgerea
în spirală în sensul acelor de ceasornic.
Soluție:
#include <fstream>
using namespace std;

int a[100][100];
int i , n , j;
ifstream cin("spirala.in");
ofstream cout("spirala.out");
int main()
{
cin >> n;
for(i = 1 ; i <= n; i++)
for(j = 1; j <= n ; j++)
cin >> a[i][j];

for(i = 1; i <= n/2+1 ; i++)


{
for(j = i; j <= n-i+1 ; j++)
cout << a[i][j] << " ";
for(j = i+1; j <= n-i+1 ; j++)
cout << a[j][n-i+1] << " ";
for(j = n - i ; j >= i; j--)
cout << a[n-i+1][j] << " ";
for(j = n-i ; j > i; j--)
cout << a[j][i] << " ";
}
return 0;
}
Probleme de rezolvat pe pbinfo:
Diagonale: 783,
Zone: 781,729, 782, 234,
Spirala: 1008

S-ar putea să vă placă și