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

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 Razzvy
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'; 
    }
}



Alte întrebări interesante