Форум сайта python.su
Всем привет кто нить может помочь ?
Массив обычно хранится в памяти как последовательность его элементов. Традиционно элементы последовательности располагаются по строкам или столбцам исходного массива. Однако, в данной задаче мы будем располагать элементы двумерного массива (прямоугольной матрицы размера n*m) по “спирали” (см. рисунок), начиная с ячейки (1,1).
Напишите программу, которая будет возвращать индексы (строку и столбец) элемента для заданной позиции в спиральной последовательности.
http://atpp.vstu.edu.ru/problems/886/ru/img.gif
Ограничения
1 <= n, m <= 100; 1<= k <= n*m; 1 <= i <= n; 1 <= j <= m.
Input
Первая строка входного файла содержит три целых числа n, m (размеры матрицы) и k (позиция элемента в спиральной последовательности).
Output
Выходной файл должен содержать два целых числа i и j – индексы элемента массива, соответствующие номеру элемента k в спиральной последовательности.
Офлайн
С использованием numpy для удобной работы с матрицами сейчас один из вариантов решения реализовал.
Вот, основаная часть задачи – получение обращение спирального индекса. К pep8 только привести нужно.
import numpy as np def reindex(n, m, k): template = np.matrix(np.array([{i+1: j+1} for i in range(n) for j in range(m)]).reshape(n, m)) res = [] while True: if template.any(): res.extend(template[0, :].ravel().tolist()[0]) template = template[1:, :] else: break if template.any(): res.extend(template[:, -1].ravel().tolist()[0]) template = template[:, :-1] else: break if template.any(): z = template[-1,:].ravel().tolist()[0] z.reverse() res.extend(z) template = template[:-1, :] else: break if template.any(): z=template[:, 0].ravel().tolist()[0] z.reverse() res.extend(z) template = template[:, 1:] else: break return res[k - 1].iteritems().next() if 0 < k <= n * m else None print(reindex(3, 3, 8))
Офлайн