- Заполнение квадратной матрицы по спирали (Python)
- Как заполнить матрицу по спирали
- Заполнение квадратной матрицы по спирали (Python): 7 комментариев
- Заполнение двумерной матрицы по спирали
- Как вывести матрицу по спирали Python?
- Создание спирального массива в Python?
- 6 ответов
- Вводные замечания
- Вывести матрицу python по спирали
Заполнение квадратной матрицы по спирали (Python)
Как заполнить матрицу по спирали
В этой записи я продемонстрирую заполнение квадратной матрицы по спирали на языке Python. Использован Python версии 3.6
Коротко объясню, для чего нужна переменная m. Обратите внимание на результирующую матрицу при n = 5:
Начиная со значения 17 мы заполняем новый виток до значения 19. То есть, имеем всего 3 значения: 17, 18, 19.
Для этого и используется коэффициент m, чтобы заново не штудировать все 5 значений.
Заполнение квадратной матрицы по спирали (Python): 7 комментариев
Никак не могу понять зачем вы делаете инкременты «i+=»1 и «v+=1», если используются «i in range» и «v in range».
Я ни в коем случае не критикую ваш код. Просто пытаюсь разобраться как это работает, поскольку являюсь очень начинающим программистом.
Заранее спасибо за ответ.
Добрый день, Лера.
Когда я писал алгоритм в коде сначала были конструкции i+=2 или i+=3, пока я не понял, что прибавлять единицу — это оптимальный вариант, но забыл, что цикл единицу и без меня прекрасно добавляет)
Поэтому вы правильно заметили, i+=1 и v+=1 там не нужны.
Они просто заставляют цикл каждый раз начинать работу «заново», просто с другим значением.
Если планируете использовать данный алгоритм, i+=1 и v+=1 вам не нужны.
Источник
Заполнение двумерной матрицы по спирали
Привет, мой читатель.
На днях встретил простую на вид задачу. Как оказалось, не легко решить такую задачу за пять, и даже за 50 минут. Здесь пришлось подумать и поэкспериментировать.
Дана матрица, или, на нашем языке, двумерный массив. Его размеры не могут превышать 10х10. Они задаются пользователем и это может быть не только квадрат, но и прямоугольник. Обозначим длины сторон через N и M. Нам необходимо заполнить эту матрицу числами от 1 и по возрастающей до M*N. Прежде, чем привести код целиком, мне хотелось бы изложить ход мыслей, чтобы стало понятно как все работает. Если же тебе просто нужно решение, то ты можешь пролистать ниже, скопировать его и закрыть страницу как больше не нужную.
Стандартно, нам нужен сам массив и переменные для хранения длин сторон прямоугольного (двумерного) массива.
Также мы будем действовать по слогике, что при заполнении мы очерчиваем прямоугольники, каждый их которых на единицу меньше с каждой стороны. Если смотреть на эти прямоугольники в декартовой системе координат, то начало каждой из сторон сдвигается на 1 вправо или вниз, а конец влево или вверх. Договоримся, что оси направлены вправо и вниз от точки [0,0].
Таким образом нам нужно знать точки начала и конца очерчиваемого прямоугольника. Это и будут точки излома (поворота). Но я еще и решил пойти следующим путем. Точки конца сторон будут равняться длине стороны первого прямоугольника минус длине текущего прямоугольника.
Обозначим их следующим образом:
Ну, и, нам нужна переменная, значением которой мы будем заполнять массив, пока она не достигнет значения M*N
В цикле начинаем заполнять массив. Сначала точке a[i][j] присваиваем значение k. Это удобно тем, что если длина сторон равна 0, то мы не войдем в массив. Иначе в точку a[i][j] положим значение k, в конце же цикла инкреминируем его.
Далее вычисляем следующий шаг
- Если у нас верхняя сторона прямоугольника и мы не достигла правой стороны, то двигаемся вправо: ++j
- Если мы на правой стороне прямоугольника и не достигли нижней стороны, то двигаемся вниз: ++i
- Если мы на нижней стороне прямоугольника и не достигли левой стороны, то двигаемся влево: —j
- Иначе двигаемся вверх: —i
В конце же каждого прохода проверяем, завершился ли прямоугольник и стои ли начинать прочерчивать новый — меньший:
- Если мы находимся на второй строке
- Если мы находимся на первом столбце
- И, в случае, если чертим не прямоугльник, а вертикальную линию, если первая строка не равна последней. (этот пункт самый сложный во всем алгоритме. Его я достиг путем экспериментов)
Тогда увеличиваем отступы от краев первого прямоугольника:
Собственно это весь алгоритм. А ниже код всей программы:
Я видел более изящные решения данной задачи, наполненные математикой и побитовыми операциями. Но для понимания того, как последовательно наполняется пассив по спирали, достаточно данного алгоритма. Буду рад, если вы оставите в комментариях свои решения и поделитесь мыслями.
Источник
Как вывести матрицу по спирали Python?
Простой 4 комментария
Кто может подсказать, буду благодарен)
Хм. Интересно, я пока раскидывал мысли насчёт варянтов решения, прикинул некий метод, который допустим назовём «Игрок и поле». И для решения задачи, оставалось лишь «заставить» воображаемого игрока «ходить» по нужному направлению в массиве, изменяю значения под ним на нужную цифру. Через ту же рекурсию с указанными шаблонами действий, от условий. Что и было продемонстрировано в одном из варянтов.
Но этот варянт всё же пару раз отбросил раздумывая над решением, что было бы ещё лучше.. Вот пока сижу и думаю над этим.
Drill ну а вообще, вместо ссылок лучше всё же часть решения в свои ответы так же вставлять (добавляя какие-то комментарии по коду).
Так как когда решение находится на стороннем сайте, то этот сайт может или удалить статью, или прекратить существование. Из-за чего, даже если кто-то найдёт этот же вопрос на Хабр в будущем, ему могут быть уже недоступны ссылки для его решения.
Источник
Создание спирального массива в Python?
Я и мой друг пытались создать забавную игру на python, в которой элементы, введенные в массив, доступны по спирали. Я пробовал несколько методов, подобных приведенному ниже (источник).
Вышеприведенный оператор обращается к элементам в спиральном цикле и печатает их для определенного массива AE. Я хотел бы знать, как я могу преобразовать данный массив AE в спиральный
6 ответов
Вы можете построить спираль, начав с центра матрицы и всегда поворачивая направо, если элемент уже не был посещен:
Ниже приведен код Python3, который преобразует:
Вы можете легко изменить реализацию таким образом, как вы хотите .
Вы можете заполнить массив чем-то вроде этого:
Результатом этого будет:
Вот решение с использованием itertools и практически без математики, только наблюдения о том, как выглядит спираль. Я думаю, что это элегантно и довольно легко понять.
Вот это же сокращенное решение:
Я проигнорировал тот факт, что вы хотите, чтобы входные данные были двумерным массивом, так как имеет больше смысла для того, чтобы они были одномерными итеративными. Вы можете легко сгладить входной 2D-массив, если хотите. Я также предположил, что результат должен быть квадратным, так как я не могу думать, чего бы вы разумно хотели иначе. Он может перебраться через край и вызвать ошибку, если квадрат имеет четную длину, а ввод слишком длинный: опять же, я не знаю, какой будет альтернатива.
Вводные замечания
Вопрос тесно связан с проблемой печати массива в спиральном порядке. На самом деле, если у нас уже есть функция, которая делает это, то рассматриваемая проблема относительно проста.
имеется множество ресурсов о том, как создать спиральную матрицу или как loop или распечатать массив в порядке спирали. Тем не менее, я решил написать свою собственную версию, используя массивы. Идея не оригинальна, но использование numpy делает код более лаконичным.
Другая причина в том, что большинство примеров создания спиральной матрицы, которую я нашел (включая код в вопросе и в других ответах), имеют дело только с квадратными матрицами размера n x n для нечетного n. Найти начальную (или конечную) точку в матрицах других размеров может быть непросто. Например, для матрицы 3х5 это не может быть средняя ячейка. Приведенный ниже код является общим, и положение начальной (конечной) точки зависит от выбора функции spiral_xxx .
Первая функция разворачивает массив в спиральном порядке по часовой стрелке:
Мы можем написать эту функцию восемью различными способами в зависимости от того, где мы начинаем и как мы вращаем матрицу. Я дам другой, который согласуется (это будет очевидно позже) с преобразованием матрицы в изображении в вопросе. Итак, в дальнейшем я буду использовать эту версию:
Как это работает:
Обратите внимание, что конечная (или начальная) точка не является средней ячейкой. Эта функция работает для всех типов матриц, но нам понадобится вспомогательная функция, которая генерирует спиральные индексы :
Теперь перейдем к двум основным функциям . Один преобразует матрицу в спиральную форму с теми же размерами, другой возвращает преобразование:
Источник
Вывести матрицу python по спирали
Copy raw contents
Copy raw contents
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Выведите таблицу размером n × n , заполненную числами от 1 до n2 по спирали, выходящей из левого верхнего |
угла и закрученной по часовой стрелке, как показано в примере (здесь n = 5 ): |
Sample Input : |
5 |
Sample Output : |
1 2 3 4 5 |
16 17 18 19 6 |
15 24 25 20 7 |
14 23 22 21 8 |
13 12 11 10 9 |
def spiral ( n ): |
dx , dy = 1 , 0 |
x , y = 0 , 0 |
myarray = [[ None ] * n for j in range ( n )] |
for i in range ( 1 , n ** 2 + 1 ): |
myarray [ x ][ y ] = i |
nx , ny = x + dx , y + dy |
if 0 nx n and 0 ny n and myarray [ nx ][ ny ] == None : |
x , y = nx , ny |
else : |
dx , dy = — dy , dx |
x , y = x + dx , y + dy |
return myarray |
def printspiral ( myarray ): |
n = range ( len ( myarray )) |
for y in n : |
for x in n : |
print ( myarray [ x ][ y ], end = ‘ ‘ ) |
print () |
n = int ( input ()) |
printspiral ( spiral ( n )) |
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Источник