Я пытаюсь решить задачу программирования, в которой у меня есть сетка каналов, представленная в виде списка позиций xy в текстовом файле. Мне нужно выяснить, какие из них правильно подключены от источника к месту назначения.
Вот пример текстового файла:

Вот соответствующая сетка, которую он представляет:

Я хочу создать сетку и перебрать ее. Я использовал pandas для чтения текстового файла, а затем превратил столбцы, представляющие значения x и y, в список.
pipes = pd.read_csv("D:\pipe.txt", delimiter = ' ', header = None)
char = pipes[0].tolist()
x_val = pipes[1].tolist()
y_val = pipes[2].tolist()
Я не знаю, существуют ли какие-либо библиотеки, которые могут помочь в работе с такими сетками.






Судя по приведенному вами примеру, похоже, что у персонажа «трубы» есть отверстия сверху, снизу, слева и справа. Если мы войдем с одной стороны, мы сможем выйти из любых отверстий с любой другой стороны.
Учитывая это, мы можем создать класс Pipe для представления этой структуры:
class Pipe:
def __init__(self, top, bottom, left, right):
self.top = top
self.bottom = bottom
self.left = left
self.right = right
В классе Pipe верх, низ, лево и право — это логические значения, которые показывают, есть ли там отверстие. Например, = будет Pipe(False, False, True, True).
Затем вы можете создать словарь, который сопоставит эти символы «канала» с объектами Pipe. Что-то вроде:
# I'm gonna assume you have a full list of "pipe" characters that will show up
pipe_mapping = {
'=': Pipe(False, False, True, True),
'‖': Pipe(True, True, False, False),
'╬': Pipe(True, True, True, True),
...
}
Благодаря этому сопоставлению мы теперь можем преобразовать текстовый файл в 2D-список. Итак, пример, который вы привели, будет выглядеть так:
map = [
['*', Pipe(True, True, True, False), None, Pipe(False, True, False, True), Pipe(False, False, True, True), 'A'],
[None, Pipe(True, True, False, True), Pipe(False, False, True, True), Pipe(True, False, True, False), None, None],
['C', None, Pipe(True, False, False, True), Pipe(False, False, True, True), 'B']
]
Это всего лишь псевдокод, объясняющий идею. Я оставлю вас разбираться, как представлять *, A, B, C и пустые места в этом контексте.
С помощью этой карты вы теперь можете реализовать свой алгоритм для решения этой задачи.
Надеюсь, поможет.
Существует около 8 различных типов труб, охватывающих одну сетку.
@Boltu Итак, в словаре pipe_mapping всего 8 записей, которые вы можете создать вручную. 2D-список можно легко получить из txt-файла с помощью кода. Вы просто читаете файл построчно, для каждой строки перебираете каждый символ и используете pipe_mapping, чтобы сопоставить символ с соответствующим объектом. Я могу написать для вас демо, если что-то еще неясно.
Позвольте мне добавить, как выглядит текстовый файл в моем исходном сообщении. Текстовый файл — это не сетка, а просто координаты труб в реальной сетке. Исходное изображение было просто представлением того, как выглядела сетка после ее построения.
@Болту, я вижу. В этом случае вам необходимо сначала рассчитать размер сетки. Ширина сетки — это наибольшее число во втором столбце. Высота сетки — это наибольшее число в третьем столбце. Затем вы сначала создаете 2D-список, заполненный None. Затем для каждой трубы вы находите соответствующую позицию в 2D-списке и помещаете туда соответствующий объект Pipe. Дайте мне знать, если это ясно.
Хорошо, это имеет смысл. Как вы думаете, смогу ли я обобщить это на сотни трубок? Судя по тому, как это выглядит в вашем примере, вы создали список вручную.