Вы можете использовать «четырехсторонний обмен» и вложенный цикл с некоторой магией вращения (разработано на бумаге):
template <typename T>
void swap(T& a, T& b, T& c, T& d)
{
T x(a);
a = b;
b = c;
c = d;
d = x;
}
template <typename T, size_t dim>
void rotate(T (&matrix)[dim][dim])
{
const size_t d = dim-1;
for (size_t y = 0; y < dim/2; ++y)
{
for (size_t x = y; x < d-y; ++x)
{
swap(matrix[y ][x ],
matrix[x ][d-y],
matrix[d-y][d-x],
matrix[d-x][y ]);
}
}
}
Тестовая программа:
template <typename T, size_t dim>
void print(T (&matrix)[dim][dim])
{
for (size_t y = 0; y < dim; ++y)
{
for (size_t x = 0; x < dim; ++x)
{
std::cout << matrix[y][x] << ' ';
}
std::cout << '\n';
}
}
int main()
{
int matrix[4][4] = {{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}};
rotate(matrix);
print(matrix);
}
Выход:
4 8 12 16
3 7 11 15
2 6 10 14
1 5 9 13
Теперь вам просто нужно преобразовать это из шаблона в динамическую форму;)