Documente Academic
Documente Profesional
Documente Cultură
O matrice in care numarul de linii este egal cu numarul de coloane se numeste matrice
patratica. O astfel de matrice este caracterizata de existenta a doua diagonal, diagonala principal
si diagonala secundara. In matricea de mai jos am evidentiat cele doua diagonale.
0 1 2 3 4 5
0 X X
1 X X
2 X X
3 X X
4 X X
5 X X
0, 0 1, 1 2, 2 3, 3 4, 4 5, 5
0, 5 1, 4 2, 3 3, 2 4, 1 5, 0
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("build.txt");
int main()
{
int n, a[100][100];
ReadMatrix(n, a);
Solve(n, a);
}
Afisati suma elementelor de deasupra diagonalei principale a unei matrice.
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("build.txt");
int main()
{
int n, a[100][100];
ReadMatrix(n, a);
Solve(n, a);
}
0 1 2 3 4 5
0 X N X
1 X X
2 X X
V E
3 X X
4 X X
5 X S X
for(i=1;i<=5;i++) 44444
for(j=1;j<=5;j++) 43333
.................. 43222
43211
43210
BONUS – SUBMATRICE
Se citeste o matrice patratica cu n linii si n coloane (n<=100) cu elemente numere intregi din
intervalul [-1000,1000]. Calculati si afisati suma maxima a unei submatrici care are coltul
stanga-sus si coltul dreapta-jos pe diagonala principala a matricii date.
Afisati pe linia urmatoare submatricea de suma maxima.
Exemplu:
matrice.in matrice.out
5 17
1 2 -3 4 5 0 -1 5
2 0 -1 5 -9 3 9 -8
-8 3 9 -8 -4 234
1 2 3 4 -1
-8 7 6 5 -13
#include <fstream>
using namespace std;
ifstream fin("matrice.in");
ofstream fout("matrice.out");
int main()
{
int A[101][100],n,smax=-100000000,imax,jmax;
fin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
fin>>A[i][j];
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
int s=0;
for(int x=i;x<=j;x++)
for(int y=i;y<=j;y++)
s=s+A[x][y];
if(s>smax)
{
smax=s;
imax=i;
jmax=j;
}
}
fout<<smax<<endl;
for(int i=imax;i<=jmax;i++)
{
for(int j=imax;j<=jmax;j++)
fout<<A[i][j]<<" ";
fout<<endl;
}
return 0;
}
Tema.
1. 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 2 2 2 2 2
afişează pe ecran 3. 22228
22222
21287
35212
2. https://www.pbinfo.ro/?pagina=probleme&id=2479
3. https://www.pbinfo.ro/?pagina=probleme&id=2625
Este un algoritm in care se pleaca dintr-un punct al unei matrice si se ajunge in alt punct
al unei matrice intr-un numar minim de miscari. Eficient el se realizeaza folosind o structura
de tip coada asa cum vom arata intr-un material care va urma.
Un soricel se afla intr-un labirint reprezentat de o matrice pe pozitia startl, startc si incearca sa
ajunga dintr-un numar minim de miscari in pozitia final, finalc. Soricelul nu poate atinge
anumite celule ale matricei in care se afla pisici. Aceste celule vor contine -1, in timp ce toate
celelalte celule vor fi 0. Soricelul se poate misca pe toate cele 8 directii posibile(vezi materialul
2 cu matrice).
Afisati harta miscarilor soricelului precum si care este numarul minim de miscari prin care
ajunge la pozitia finala.
0 0 0 0 -1 0
0 0 -1 0 finall, finalc 0
0 0 0 0 0 0
0 0 0 0 -1 0
startl, startc 0 0 0 0 0
0 -1 0 0 0 0
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("lee.txt");
//declar pozitiile in care se poate deplasa soarecele din pozitia i, j
//adica sus, pe diagonala dreapta sus, dreapta, pe diagonala dreapta jos
//jos, pe diagonala stanga jos, stanga, pe diagonala stanga sus
int dl[] = { -1, -1, 0, 1, 1, 1, 0 };
int dc[] = { 0, 1, 1, 1, 0, -1, -1 };
/*sau
if(a[finall][finalc] !=0)
return 1;
else
return 0;
*/
}
void Lee(int n, int a[100][100], int startl, int startc, int finall, int finalc)
{
int i, j, k, valoare = 1;
a[startl][startc] = valoare;
while(Final(finall, finalc, a) == 0)
{
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
if(a[i][j] == valoare)//daca identific un punct in care a ajuns soricelul
for(k = 0; k < 8; k++)//incerc sa vad unde poate ajunge soricelul
if(a[i + dl[k]][j + dc[k]] == 0)//daca nu a mai fost in
punctul in care poate ajunge
a[i + dl[k]][j + dc[k]] = valoare + 1;//il completez
valoare++;//pregatesc urmatoarea miscare a soricelului
}
}
int main()
{
int a[100][100], n, startl, startc, finall, finalc;
//Introduc manual pozitia initiala si finala a soricelului
startl = 5; startc = 1;
finall = 2; finalc = 5;
//citesc matricea
ReadMatrix(n, a);
//bordez matricea
BorderMatrix(n, a);
//Generez miscarile soricelului
Lee(n ,a, startl, startc, finall, finalc);
//Afisez matricea completata
WriteMatrix(n, a);
}