Jan 3, 2022
Для меня это было интересным заданием. Спешу поделиться своими размышлениями)
Дана матрица размером x на y:
1 2 3 4 5 6
2 3 4 5 6 7
3 4 5 6 7 8
4 5 6 7 8 9
Нужно её повернуть по часовой стрелке на заданное количество шагов. Нарисовал рисунок со стрелочками, бросилось в глаза, что в любой матрице образуются круги вращения. Если бы каждый круг как-то поместить в список, то с вращением стало бы всё просто. А в конце вращения опять преобразовать списки в круги матрицы.
В итоге получился следующий алгоритм:
# подсчитываем количество кругов
'''функция циклом переводим круги в строки, и помещаем в список'''
'''функция поворачиваем круги в цикле T раз'''
'''функция записи кругов в макет матрицы'''
# переводим список строк в список списков
# создаем макет для повернутой матрицы
# цикл записи кругов в макет матрицы
# заносим круг целиком в макет матрицы
# заносим верхнюю часть круга
# создаём счётчик для номера цифры которую вставляем из круга в повернутую матрицу
# проходимся циклом по правому краю круга для circles_list
# заменяем последнее значение списка на нужный символ
добавляем значение в счётчик
# заполняем нижнюю часть круга
# заполняем левую часть круга
# заменяем последнее значение списка на нужный символ
# добавляем значение в счётчик
# преобразуем список списков в список строк
Код скорректирован с учетом рекомендаций линтера
Протестировано с помощью unittest
Оценка меры сложности алгоритма поворота матрицы. Сделал оценку по рассмотренной задаче. Верхняя оценка сложности О-большое равна квадратичной зависимости О(n^3). Одним словом, для реальных данных алгоритм пришлось бы переделывать.