#include <iostream>
#include <vector>

using namespace std;

void rotateClockwise(vector<vector<int>>& matrix) {
    int n = matrix.size();
    vector<int> elements; // pentru a stoca elementele din afara diagonalelor

    // Colectăm elementele care sunt în afara diagonalelor
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            if (i != j && i + j != n - 1) { // verificăm dacă nu sunt pe diagonala principală sau secundară
                elements.push_back(matrix[i][j]);
            }
        }
    }

    // Rotim elementele în sensul acelor de ceasornic
    int k = 0; // index pentru elementele rotite
    for (int j = n - 1; j > 0; --j) { // pentru fiecare coloană de sus în jos
        for (int i = 0; i < n; ++i) {
            if (i != j && i + j != n - 1) { // verificăm din nou diagonalele
                matrix[i][j] = elements[k++];
            }
        }
    }

    // Reintroducem elementele pe pozițiile corecte
    k = 0;
    for (int j = 0; j < n; ++j) {
        for (int i = 0; i < n; ++i) {
            if (i != j && i + j != n - 1) { // verificăm din nou diagonalele
                matrix[i][j] = elements[k++];
            }
        }
    }
}

int main() {
    // Exemplu de matrice 4x4
    vector<vector<int>> matrix = {
        { 1, 2, 3, 4 },
        { 5, 6, 7, 8 },
        { 9, 10, 11, 12 },
        { 13, 14, 15, 16 }
    };

    // Afișăm matricea originală
    cout << "Matricea originală:" << endl;
    for (const auto& row : matrix) {
        for (const auto& elem : row) {
            cout << elem << " ";
        }
        cout << endl;
    }

    rotateClockwise(matrix);

    // Afișăm matricea după rotație
    cout << "Matricea după rotație:" << endl;
    for (const auto& row : matrix) {
        for (const auto& elem : row) {
            cout << elem << " ";
        }
        cout << endl;
    }

    return 0;
}
