#include <stdio.h>

#define N 3 // Dimensione della matrice (N x N)

// Funzione per stampare la matrice
void stampaMatrice(int matrice[N][N]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%d ", matrice[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

// Inversione degli elementi della matrice
void inverteMatrice(int matrice[N][N]) {
    int totaleElementi = N * N;
    for (int i = 0; i < totaleElementi / 2; i++) {
        int riga1 = i / N;
        int col1 = i % N;
        int riga2 = (totaleElementi - 1 - i) / N;
        int col2 = (totaleElementi - 1 - i) % N;

        // Scambio degli elementi
        int temp = matrice[riga1][col1];
        matrice[riga1][col1] = matrice[riga2][col2];
        matrice[riga2][col2] = temp;
    }
}

// Rotazione della matrice di 90 gradi in senso orario
void ruota90Gradi(int matrice[N][N]) {
    int temp[N][N];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            temp[j][N - 1 - i] = matrice[i][j];
        }
    }
    // Copia la matrice ruotata nella matrice originale
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            matrice[i][j] = temp[i][j];
        }
    }
}

// Rotazione della matrice di 180 gradi
void ruota180Gradi(int matrice[N][N]) {
    for (int i = 0; i < N * N / 2; i++) {
        int riga1 = i / N;
        int col1 = i % N;
        int riga2 = (N * N - 1 - i) / N;
        int col2 = (N * N - 1 - i) % N;

        // Scambio degli elementi
        int temp = matrice[riga1][col1];
        matrice[riga1][col1] = matrice[riga2][col2];
        matrice[riga2][col2] = temp;
    }
}

// Funzione principale
int main() {
    int matrice[N][N] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    printf("Matrice originale:\n");
    stampaMatrice(matrice);

    // Inversione degli elementi
    inverteMatrice(matrice);
    printf("Matrice con inversione degli elementi:\n");
    stampaMatrice(matrice);

    // Ripristina la matrice originale per le rotazioni
    int matriceOriginale[N][N] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    // Rotazione di 90 gradi
    ruota90Gradi(matriceOriginale);
    printf("Matrice ruotata di 90 gradi:\n");
    stampaMatrice(matriceOriginale);

    // Rotazione di 180 gradi
    ruota180Gradi(matrice);
    printf("Matrice ruotata di 180 gradi:\n");
    stampaMatrice(matrice);

    return 0;
}
