Fie o matrice pătratică A de dimensiune N. Celulele matricei sunt 0 sau 1. Se consideră cele trei matrice ce pot fi obţinute prin rotirea matricei A cu 90°, cu 180°, şi cu 270°, respectiv. Se doreste construirea altei matrice pătratice B de dimensiune M. Orice celulă din B trebuie să fie egală cu 1 dacă cel puţin o celulă corespunzătoare (aceeaşi linie, aceeaşi coloana) din matricea A sau cele 3 derivate (prin rotire) ale sale este egală cu 1. În caz contrar, celulă trebuie să fie 0. Calculează matricea B.
Răspunsuri la întrebare
Răspuns de
2
Presupunem ca matircea este indexata de la 0:
Prin rotirea cu 90 de grade in sensul acelor de ceasornic elementele din A iau urmatoarea valoare:
A[i][j] = A[n - j][i], oricare 0 ≤ i, j < n
La urmatoarea rotire cu 90 de grade(180 in total), aplicam aceeasi formula:
Daca A[x][y] = A[n - y][x], iar x = n - j si y = i, atunci:
A[n - j][i] = A[n - i][n - j]
Aplicand aceeasi regula, pentru 270 de grade va fi:
A[n - i][n - j] = A[n - (n - j)][n - i] = A[j][n - i]
A[n - i][n - j] = A[j][n - i]
Se observa ca daca mai aplicam odata formula in lant, ajungem de unde am plecat, la A[i][j]. Ceea ce este si logic deoarece rotirea cu 360 de grade este echivalenta cu rotirea cu 0 grade.
Asadar, celula A[i][j], va lua pe rand valorile de mai sus, in urma fiecarei rotiri. Ca B[i][j] sa fie 1, cel putin una din celulele corespunzatoare celor 4 matrici trebuie sa fie 1. Asta se poate scrie astfel:
daca A[i][j] = 1 sau A[n - j][i] = 1 sau A[n - i][n - j] = 1 sau A[j][n - i] = 1 atunci:
B[i][j] = 1
altfel
B[i][j] = 0
C++:
#include <iostream>
using namespace std;
int main()
{
int n;
bool a[100][100], b[100][100];
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> a[i][j];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
b[i][j] = a[i][j] | a[n - j][i] | a[n - i][n - j] | a[j][n - i]; /*expresia va returna 1 daca cel putin unul din cele 4 elemente este 1, altfel va returna 0*/
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
cout << b[i][j] << ' ';
cout << '\n';
}
}
Prin rotirea cu 90 de grade in sensul acelor de ceasornic elementele din A iau urmatoarea valoare:
A[i][j] = A[n - j][i], oricare 0 ≤ i, j < n
La urmatoarea rotire cu 90 de grade(180 in total), aplicam aceeasi formula:
Daca A[x][y] = A[n - y][x], iar x = n - j si y = i, atunci:
A[n - j][i] = A[n - i][n - j]
Aplicand aceeasi regula, pentru 270 de grade va fi:
A[n - i][n - j] = A[n - (n - j)][n - i] = A[j][n - i]
A[n - i][n - j] = A[j][n - i]
Se observa ca daca mai aplicam odata formula in lant, ajungem de unde am plecat, la A[i][j]. Ceea ce este si logic deoarece rotirea cu 360 de grade este echivalenta cu rotirea cu 0 grade.
Asadar, celula A[i][j], va lua pe rand valorile de mai sus, in urma fiecarei rotiri. Ca B[i][j] sa fie 1, cel putin una din celulele corespunzatoare celor 4 matrici trebuie sa fie 1. Asta se poate scrie astfel:
daca A[i][j] = 1 sau A[n - j][i] = 1 sau A[n - i][n - j] = 1 sau A[j][n - i] = 1 atunci:
B[i][j] = 1
altfel
B[i][j] = 0
C++:
#include <iostream>
using namespace std;
int main()
{
int n;
bool a[100][100], b[100][100];
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> a[i][j];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
b[i][j] = a[i][j] | a[n - j][i] | a[n - i][n - j] | a[j][n - i]; /*expresia va returna 1 daca cel putin unul din cele 4 elemente este 1, altfel va returna 0*/
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
cout << b[i][j] << ' ';
cout << '\n';
}
}
Alte întrebări interesante
Engleza,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
9 ani în urmă
Matematică,
9 ani în urmă
Limba română,
9 ani în urmă
Geografie,
9 ani în urmă