Я не совсем уверен, как описать мой вопрос здесь, поэтому, я думаю, я попытаюсь сначала объяснить ситуацию. У меня есть набор данных, который вытягивается из квадратной решетчатой сетки из четырехгранных многоугольников. Размеры решетки не гарантируются, в частности. У меня есть доступ к данным, которые описывают соседи любой точки на сетке (т. Е. «Точка 236 имеет ребра к точкам 417, 872, 123 и 331»), и это о ней.Pythonic способ выяснить прямые пути на квадратной решетке сетки?
Что у меня есть это:
graph = [set([5, 9]), set([4, 11]), set([5, 6, 12]), set([6, 10, 2]), \
set([1, 3, 8]), set([3, 7, 4]), set([6, 12, 10, 16]), \
set([5, 9, 18, 12]), set([1, 8, 13]), set([4, 11, 7, 15]), \
set([2, 10, 17]), set([3, 7, 8, 14]), set([9, 18]), \
set([18, 12, 16]), set([16, 10, 17]), set([14, 7, 15]), \
set([15, 11]), set([13, 8, 14])]
Где graph[n]
позволяет мне получить доступ к соседям любой заданной точке по индексу n
... Весь набор данных, которые могут быть визуализированы в 2D-графике, показанном ниже (которые не имеют доступа к другой, то с помощью данных, указанных выше):
*--------*--------*-------*-------*-------*
| 1 | 5 | 3 | 6 | 4 | 2
| | | | | |
| | | | | |
*--------*--------*-------*-------*-------*
| 9 | 8 | 12 | 7 | 10 | 11
| | | | | |
| | | | | |
*--------*--------*-------*-------*-------*
13 18 14 16 15 17
И я пытаюсь, чтобы включить его в набор данных, который выглядит следующим образом:
u = [[1, 5, 3, 6, 4, 2], [9, 8, 12, 7, 10, 11], [13, 18, 14, 16, 15, 17]]
v = [[1, 9, 13], [5, 8, 18], [3, 12, 14], [6, 7, 16], [4, 10, 15], [2, 11, 17]]
Выходные данные описывают параллельные линии сетки (начиная с угла с наименьшим номером индекса). Гарантируется, что каждая точка имеет уникальный индекс, и сетка гарантированно будет иметь непрерывный набор индексов (в данном случае от 1 до 18), но порядок не гарантируется каким-либо образом. Размеры сетки не известны заранее. Каждая точка будет иметь только значение 2 (угловая точка), 3 (крайняя точка) или 4 (точка где-то в центре).
Теперь я написал подход грубой силы к этому, но он довольно неэффективен. Он состоит из вычисления первых двух горизонтальных и вертикальных краев (в данном случае [1, 5, 3, 6, 4, 2] и [1, 9, 13]), затем «сдвигая» каждое кромку, получая соединенных соседей каждой точки и вычитая из них уже посещенный набор (так 1 -> 5, 9 -> 8, 13 -> 18) и повторяя этот процесс, пока вы не нажмете на другую сторону сетки.
Что мне было интересно, если был более «питонический» способ справиться с этим. Мой собственный код разделен на несколько разных этапов, но я решил, что нужно сделать какой-то способ сделать это одним махом, а не повторять все так много раз (в настоящее время он принимает меня около 60 мс за ход, чтобы понять все это, и я пытаюсь довести это до 20 мс, если это возможно).
Позвольте мне получить это прямо. Вы знаете, какие соседи имеют каждая точка, но не в каком направлении расположены соседи, и вы хотите найти последовательность точек на каждой линии решетки (и, таким образом, восстановить решетку)? – user2357112
Да. Можно с уверенностью предположить, что угол (все четыре из которых имеют степень 2) с самым низким индексом - это начальная точка (в этом примере это будет # 1). Что касается упорядочения, пути должны начинаться в этом углу и расширяться в противоположном направлении, пока они не смогут идти дальше (о чем свидетельствуют приведенные выше списки u & v). Мне не обязательно нужно реконструировать решетку для каждого слова - я просто пытаюсь создать списки, которые определяют каждый путь в любом направлении (влево/вправо или вверх/вниз). Я думаю, вы могли бы сказать, что я пытаюсь разбить его на строки и столбцы. –
Имеет ли значение, какой путь прав, а какой путь вниз? – user2357112