Уведомления

Группа в Telegram: @pythonsu

#1 Март 10, 2017 14:37:43

HARDFANATIK
Зарегистрирован: 2017-03-10
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача

Всем привет кто нить может помочь ?

Массив обычно хранится в памяти как последовательность его элементов. Традиционно элементы последовательности располагаются по строкам или столбцам исходного массива. Однако, в данной задаче мы будем располагать элементы двумерного массива (прямоугольной матрицы размера 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 в спиральной последовательности.



Офлайн

#2 Март 11, 2017 13:31:31

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Задача

С использованием 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))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version