Циклический сдвиг элементов матрицы против часовой стрелки - C (СИ)
Формулировка задачи:
Задана квадратная матрица символов. Осуществить циклический сдвиг элементов следующим образом: элементы нулевой строки сдвигаются в нулевой столбец сверху вниз, из него - в последнюю строку слева направо, из нее - в последний столбец снизу вверх, из него - в нулевую строку справа налево и далее по кругу против часовой стрелки. Элементы первой сроки сдвигаются аналогично и так далее.
Три вечера думаю, но достойно работающего варианта пока не нашел. Может быть, подскажите. Не нужно писать всю программу, небольшой фрагмент с методом (идеей).
Заранее спасибо.
Решение задачи: «Циклический сдвиг элементов матрицы против часовой стрелки»
textual
Листинг программы
#include <stdio.h>
#include <math.h>
//-----------------------------------------------------------------------------
int* Rotate(const int* source, int* result, const size_t n)
{
size_t i, j;
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
result[i * n + j] = source[j * n + (n - i - 1)];
}
}
return result;
}
//-----------------------------------------------------------------------------
void Print(const int* array, const size_t n)
{
size_t i, j;
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
printf("%d ", array[i * n + j]);
}
printf("\n");
}
printf("\n");
}
//-----------------------------------------------------------------------------
int main()
{
int source[] = {11, 12, 13, 14, 15,
21, 22, 23, 24, 25,
31, 32, 33, 34, 35,
41, 42, 43, 44, 45,
51, 52, 53, 54, 55};
size_t len = sizeof(source) / sizeof(*source);
int result[len];
size_t n = sqrt(len);
Print(source, n);
Rotate(source, result, n);
Print(result, n);
return 0;
}
Объяснение кода листинга программы
- В функции
Rotateпроисходит циклический сдвиг элементов матрицы против часовой стрелки. - В функции
Printпроисходит вывод элементов матрицы построчно с помощью циклаfor. - В функции
mainопределен исходный массивsourceразмером 5x5 и вычислен его размерlen. - Результат циклического сдвига сохраняется в массиве
result. - Вычисляется размерность матрицы
nкак квадратный корень из общего количества элементов. - Выводится исходный массив
sourceс помощью функцииPrint. - Результат циклического сдвига выводится с помощью функции
Print.