Функции очень помогут вам разбить задачу на более простые части.
///Повернуть рамку на 1 позицию
///\param top номер строки левого верхнего угла рамки в исходной матрице
///\param left номер колонки левого верхнего угла рамки в исходной матрице
///\param width ширина рамки (количество колонок)
///\param width height высота рамки (количество строк)
/// left
/// | w
/// ************
/// top--***abcdef***
/// h***n****g***
/// ***mlkjih***
/// ************
///
/// rotateFrame(matrix, 1, 3, 6, 3)
void rotateFrame(int **matrix, int top, int left, int width, int height)
{
if (width == 1)
{
int copyOfLast = shiftColumn(matrix, top, left, height, true);
matrix[top][left] = copyOfLast
return;
}
if (height == 1)
{
int copyOfLast = shiftRow(matrix, top, left, width, true);
matrix[top][left] = copyOfLast
return;
}
//верхняя строка
int copyOfLast = shiftRow(matrix, top, left, width, true);
//левый столбец
shiftColumn(matrix, top, left, height, false);
//нижняя строка
shiftRow(matrix, top + height - 1, left, width, false);
//правый столбец
shiftColumn(matrix, top, left + width - 1, height, true);
//восстанавливаем элемент из правого верхнего угла
matrix[top + 1][left + width - 1] = copyOfLast;
}
///Сдвинуть участок строки длинной length на одну позицию в лево или право в зависимости от shiftLeft.
///Первый элемент не изменяется, последний пропадает.
///Возвращает элемент, который будет утрачен.
/// **abcd** -> **aabc** (shiftLeft == true), возвращаем d
/// **abcd** -> **bcdd** (shiftLeft == false), возвращаем a
int shiftRow(int **matrix, int top, int left, int length, bool shiftLeft)
{
}
///Аналогично shiftRow, но для столбца
int shiftColumn(int **matrix, int top, int left, int length, bool shiftDown)
{
}