from copy import deepcopy
from datetime import datetime
class Node:
def __init__(self, coord = (), lenght = 0, turn = 0, asx = None):
self.coord = coord //координаты ячейки
self.lenght = lenght //длина пути
self.turn = turn //количество поворотов
self.asx = asx //идет ли движение по оси Х
class Graph:
def __init__(self, data = {}):
self.__hash = data
self.__node_hash = {}
self.__stackhash = {}
self.__new_edges = []
self.__added_vertex = []
self.__data2 = deepcopy(data)
for j in self.__data2.keys():
edges = self.__data2[j]
self.__added_vertex.append(j)
for edge in edges:
if edge[0] not in self.__added_vertex:
self.add_edge_weight(j, edge[0], edge[1])
self.__new_edges.append(((j, edge[0]), edge[1]))
def width_search(self, i, j):
queue = []
if self.mtx_labels[i][j]:
return
mtx_value = self.matrix[i][j]
queue.append((i, j))
while len(queue) != 0:
queue_value = queue.pop(0)
i = queue_value[0]
j = queue_value[1]
mtx_value = self.matrix[i+1][j]
if mtx_value == 0:
queue.append((i+1, j))
self.matrix[i+1][j] = 1
self.mtx_labels[i+1][j] = True
mtx_value = self.matrix[i-1][j]
if mtx_value == 0:
queue.append((i-1, j))
self.matrix[i-1][j] = 1
self.mtx_labels[i-1][j] = True
mtx_value = self.matrix[i][j+1]
if mtx_value == 0:
queue.append((i, j+1))
self.matrix[i][j+1] = 1
self.mtx_labels[i][j+1] = True
mtx_value = self.matrix[i][j-1]
if mtx_value == 0:
queue.append((i, j-1))
self.matrix[i][j-1] = 1
self.mtx_labels[i][j-1] = True
def print_matrix(self):
for line in self.matrix:
print(line)
def add_vertex(self, index):
self.__hash[index] = []
def add_edge_weight(self, vertex1, vertex2, weight):
if vertex1 not in self.__hash.keys():
self.add_vertex(vertex1)
if vertex2 not in self.__hash.keys():
self.add_vertex(vertex2)
self.__hash[vertex1].append((vertex2, weight))
self.__hash[vertex2].append((vertex1, weight))
def add_edge(self, vertex1, vertex2):
if vertex1 not in self.__hash.keys():
self.add_vertex(vertex1)
if vertex2 not in self.__hash.keys():
self.add_vertex(vertex2)
self.__hash[vertex1].append(vertex2)
self.__hash[vertex2].append(vertex1)
def delete_edge(self, vertex1, vertex2):
self.__hash[vertex1].remove(vertex2)
self.__hash[vertex2].remove(vertex1)
def delete_vertex(self, index):
edges = self.__hash[index]
for edge in edges:
self.delete_edge(edge, index)
del self.__hash[index]
def print(self):
for item in self.__hash:
print('{0} => {1}'.format(item, self.__hash[item]))
def _deep_search(self, index, labels, graph):
edges = self.__hash[index]
for edge in edges:
if not labels[edge-1]:
labels[edge-1] = True
graph.add_edge(edge, index)
if not labels[index-1]:
labels[index-1] = True
graph = self._deep_search(edge, labels, graph)
return graph
def get_min_frame(self):
frame = Graph()
components = {}
for vertex in self.__hash.keys():
frame.add_vertex(vertex)
components[vertex] = vertex
sortedEdges = sorted(self.__new_edges, key=lambda edge: edge[1])
edgesCount = len(components) - 1
count = 0
for edge in sortedEdges:
if(count == edgesCount):
break
if(components[edge[0][0]] != components[edge[0][1]]):
frame.add_edge(edge[0][0], edge[0][1])
count = count + 1
comp1 = components[edge[0][0]]
comp2 = components[edge[0][1]]
for comp in components.keys():
if(components[comp] == comp2):
components[comp] = comp1
return frame
print('Start')
print(datetime.now())
my_data = {1:[(2, 10), (6, 12)], 2:[(1, 10), (3, 11), (6, 3)], 3:[(2, 11), (4, 4), (5, 5), (6, 1)], 4:[(3, 4), (5, 3)], 5:[(3, 5), (4, 3), (6, 8)], 6:[(1, 12), (2, 3), (3, 1), (5, 8)], 7:[(8, 1), (9, 5), (10, 6)], 8:[(7, 1), (9, 4), (10, 2)], 9:[(7, 5), (8, 4), (10, 3)], 10:[(7, 6), (8, 2), (9, 3)]}
graph = Graph(my_data)
frame = graph.get_min_frame()
frame.print()
print(datetime.now())
print('Finish')
ZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQoKY2xhc3MgTm9kZToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb29yZCA9ICgpLCBsZW5naHQgPSAwLCB0dXJuID0gMCwgYXN4ID0gTm9uZSk6CiAgICAgICAgc2VsZi5jb29yZCA9IGNvb3JkIC8v0LrQvtC+0YDQtNC40L3QsNGC0Ysg0Y/Rh9C10LnQutC4CiAgICAgICAgc2VsZi5sZW5naHQgPSBsZW5naHQgLy/QtNC70LjQvdCwINC/0YPRgtC4CiAgICAgICAgc2VsZi50dXJuID0gdHVybiAvL9C60L7Qu9C40YfQtdGB0YLQstC+INC/0L7QstC+0YDQvtGC0L7QsgogICAgICAgIHNlbGYuYXN4ID0gYXN4IC8v0LjQtNC10YIg0LvQuCDQtNCy0LjQttC10L3QuNC1INC/0L4g0L7RgdC4INClCgpjbGFzcyBHcmFwaDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhID0ge30pOgogICAgICAgIHNlbGYuX19oYXNoID0gZGF0YQogICAgICAgIHNlbGYuX19ub2RlX2hhc2ggPSB7fQogICAgICAgIHNlbGYuX19zdGFja2hhc2ggPSB7fQogICAgICAgIHNlbGYuX19uZXdfZWRnZXMgPSBbXQogICAgICAgIHNlbGYuX19hZGRlZF92ZXJ0ZXggPSBbXQogICAgICAgIHNlbGYuX19kYXRhMiA9IGRlZXBjb3B5KGRhdGEpCiAgICAgICAgZm9yIGogaW4gc2VsZi5fX2RhdGEyLmtleXMoKToKICAgICAgICAgICAgZWRnZXMgPSBzZWxmLl9fZGF0YTJbal0KICAgICAgICAgICAgc2VsZi5fX2FkZGVkX3ZlcnRleC5hcHBlbmQoaikKICAgICAgICAgICAgZm9yIGVkZ2UgaW4gZWRnZXM6CiAgICAgICAgICAgICAgICBpZiBlZGdlWzBdIG5vdCBpbiBzZWxmLl9fYWRkZWRfdmVydGV4OgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX2VkZ2Vfd2VpZ2h0KGosIGVkZ2VbMF0sIGVkZ2VbMV0pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fX25ld19lZGdlcy5hcHBlbmQoKChqLCBlZGdlWzBdKSwgZWRnZVsxXSkpCgogICAgICAgIAogICAgZGVmIHdpZHRoX3NlYXJjaChzZWxmLCBpLCBqKToKICAgICAgICBxdWV1ZSA9IFtdCiAgICAgICAgaWYgc2VsZi5tdHhfbGFiZWxzW2ldW2pdOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBtdHhfdmFsdWUgPSBzZWxmLm1hdHJpeFtpXVtqXQogICAgICAgIHF1ZXVlLmFwcGVuZCgoaSwgaikpCiAgICAgICAgd2hpbGUgbGVuKHF1ZXVlKSAhPSAwOgogICAgICAgICAgICBxdWV1ZV92YWx1ZSA9IHF1ZXVlLnBvcCgwKQogICAgICAgICAgICBpID0gcXVldWVfdmFsdWVbMF0KICAgICAgICAgICAgaiA9IHF1ZXVlX3ZhbHVlWzFdCiAgICAgICAgICAgIG10eF92YWx1ZSA9IHNlbGYubWF0cml4W2krMV1bal0KICAgICAgICAgICAgaWYgbXR4X3ZhbHVlID09IDA6CiAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQoKGkrMSwgaikpCiAgICAgICAgICAgICAgICBzZWxmLm1hdHJpeFtpKzFdW2pdID0gMQogICAgICAgICAgICAgICAgc2VsZi5tdHhfbGFiZWxzW2krMV1bal0gPSBUcnVlCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgbXR4X3ZhbHVlID0gc2VsZi5tYXRyaXhbaS0xXVtqXQogICAgICAgICAgICBpZiBtdHhfdmFsdWUgPT0gMDoKICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZCgoaS0xLCBqKSkKICAgICAgICAgICAgICAgIHNlbGYubWF0cml4W2ktMV1bal0gPSAxCiAgICAgICAgICAgICAgICBzZWxmLm10eF9sYWJlbHNbaS0xXVtqXSA9IFRydWUKICAgICAgICAgICAgICAgIAogICAgICAgICAgICBtdHhfdmFsdWUgPSBzZWxmLm1hdHJpeFtpXVtqKzFdCiAgICAgICAgICAgIGlmIG10eF92YWx1ZSA9PSAwOgogICAgICAgICAgICAgICAgcXVldWUuYXBwZW5kKChpLCBqKzEpKQogICAgICAgICAgICAgICAgc2VsZi5tYXRyaXhbaV1baisxXSA9IDEKICAgICAgICAgICAgICAgIHNlbGYubXR4X2xhYmVsc1tpXVtqKzFdID0gVHJ1ZQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIG10eF92YWx1ZSA9IHNlbGYubWF0cml4W2ldW2otMV0KICAgICAgICAgICAgaWYgbXR4X3ZhbHVlID09IDA6CiAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQoKGksIGotMSkpCiAgICAgICAgICAgICAgICBzZWxmLm1hdHJpeFtpXVtqLTFdID0gMQogICAgICAgICAgICAgICAgc2VsZi5tdHhfbGFiZWxzW2ldW2otMV0gPSBUcnVlCgogICAgZGVmIHByaW50X21hdHJpeChzZWxmKToKICAgICAgICBmb3IgbGluZSBpbiBzZWxmLm1hdHJpeDoKICAgICAgICAJcHJpbnQobGluZSkKICAgIAogICAgZGVmIGFkZF92ZXJ0ZXgoc2VsZiwgaW5kZXgpOgogICAgCXNlbGYuX19oYXNoW2luZGV4XSA9IFtdIAoKICAgIGRlZiBhZGRfZWRnZV93ZWlnaHQoc2VsZiwgdmVydGV4MSwgdmVydGV4Miwgd2VpZ2h0KToKICAgICAgICBpZiB2ZXJ0ZXgxIG5vdCBpbiBzZWxmLl9faGFzaC5rZXlzKCk6CiAgICAgICAgICAgIHNlbGYuYWRkX3ZlcnRleCh2ZXJ0ZXgxKQogICAgICAgICAgICAKICAgICAgICBpZiB2ZXJ0ZXgyIG5vdCBpbiBzZWxmLl9faGFzaC5rZXlzKCk6CiAgICAgICAgICAgIHNlbGYuYWRkX3ZlcnRleCh2ZXJ0ZXgyKQogICAgICAgICAgICAKICAgICAgICBzZWxmLl9faGFzaFt2ZXJ0ZXgxXS5hcHBlbmQoKHZlcnRleDIsIHdlaWdodCkpCiAgICAgICAgc2VsZi5fX2hhc2hbdmVydGV4Ml0uYXBwZW5kKCh2ZXJ0ZXgxLCB3ZWlnaHQpKQogICAgCiAgICBkZWYgYWRkX2VkZ2Uoc2VsZiwgdmVydGV4MSwgdmVydGV4Mik6CiAgICAgICAgaWYgdmVydGV4MSBub3QgaW4gc2VsZi5fX2hhc2gua2V5cygpOgogICAgICAgICAgICBzZWxmLmFkZF92ZXJ0ZXgodmVydGV4MSkKICAgICAgICAgICAgCiAgICAgICAgaWYgdmVydGV4MiBub3QgaW4gc2VsZi5fX2hhc2gua2V5cygpOgogICAgICAgICAgICBzZWxmLmFkZF92ZXJ0ZXgodmVydGV4MikKICAgICAgICAgICAgCiAgICAgICAgc2VsZi5fX2hhc2hbdmVydGV4MV0uYXBwZW5kKHZlcnRleDIpCiAgICAgICAgc2VsZi5fX2hhc2hbdmVydGV4Ml0uYXBwZW5kKHZlcnRleDEpCiAgICAgICAgCiAgICBkZWYgZGVsZXRlX2VkZ2Uoc2VsZiwgdmVydGV4MSwgdmVydGV4Mik6CiAgICAgICAgc2VsZi5fX2hhc2hbdmVydGV4MV0ucmVtb3ZlKHZlcnRleDIpCiAgICAgICAgc2VsZi5fX2hhc2hbdmVydGV4Ml0ucmVtb3ZlKHZlcnRleDEpCiAgICAgICAgCiAgICBkZWYgZGVsZXRlX3ZlcnRleChzZWxmLCBpbmRleCk6CiAgICAgICAgZWRnZXMgPSBzZWxmLl9faGFzaFtpbmRleF0KICAgICAgICBmb3IgZWRnZSBpbiBlZGdlczoKICAgICAgICAgICAgc2VsZi5kZWxldGVfZWRnZShlZGdlLCBpbmRleCkKICAgICAgICBkZWwgc2VsZi5fX2hhc2hbaW5kZXhdCiAgICAgICAgCiAgICBkZWYgcHJpbnQoc2VsZik6CiAgICAJZm9yIGl0ZW0gaW4gc2VsZi5fX2hhc2g6CiAgICAgICAgICAgIHByaW50KCd7MH0gPT4gezF9Jy5mb3JtYXQoaXRlbSwgc2VsZi5fX2hhc2hbaXRlbV0pKQogCiAgICBkZWYgX2RlZXBfc2VhcmNoKHNlbGYsIGluZGV4LCBsYWJlbHMsIGdyYXBoKToKICAgICAgICBlZGdlcyA9IHNlbGYuX19oYXNoW2luZGV4XQogICAgICAgIGZvciBlZGdlIGluIGVkZ2VzOgogICAgICAgIAlpZiBub3QgbGFiZWxzW2VkZ2UtMV06CiAgICAgICAgICAgICAgICAgICAgbGFiZWxzW2VkZ2UtMV0gPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZ3JhcGguYWRkX2VkZ2UoZWRnZSwgaW5kZXgpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxhYmVsc1tpbmRleC0xXToKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzW2luZGV4LTFdID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBncmFwaCA9IHNlbGYuX2RlZXBfc2VhcmNoKGVkZ2UsIGxhYmVscywgZ3JhcGgpCiAgICAgICAgcmV0dXJuIGdyYXBoCgogICAgZGVmIGdldF9taW5fZnJhbWUoc2VsZik6CiAgICAgICAgZnJhbWUgPSBHcmFwaCgpCiAgICAgICAgY29tcG9uZW50cyA9IHt9CiAgICAgICAgZm9yIHZlcnRleCBpbiBzZWxmLl9faGFzaC5rZXlzKCk6CiAgICAgICAgICAgIGZyYW1lLmFkZF92ZXJ0ZXgodmVydGV4KQogICAgICAgICAgICBjb21wb25lbnRzW3ZlcnRleF0gPSB2ZXJ0ZXgKICAgICAgICBzb3J0ZWRFZGdlcyA9IHNvcnRlZChzZWxmLl9fbmV3X2VkZ2VzLCBrZXk9bGFtYmRhIGVkZ2U6IGVkZ2VbMV0pCiAgICAgICAgZWRnZXNDb3VudCA9IGxlbihjb21wb25lbnRzKSAtIDEKICAgICAgICBjb3VudCA9IDAKICAgICAgICBmb3IgZWRnZSBpbiBzb3J0ZWRFZGdlczoKICAgICAgICAgICAgaWYoY291bnQgPT0gZWRnZXNDb3VudCk6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZihjb21wb25lbnRzW2VkZ2VbMF1bMF1dICE9IGNvbXBvbmVudHNbZWRnZVswXVsxXV0pOgogICAgICAgICAgICAgICAgICAgIGZyYW1lLmFkZF9lZGdlKGVkZ2VbMF1bMF0sIGVkZ2VbMF1bMV0pCiAgICAgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKICAgICAgICAgICAgICAgICAgICBjb21wMSA9IGNvbXBvbmVudHNbZWRnZVswXVswXV0KICAgICAgICAgICAgICAgICAgICBjb21wMiA9IGNvbXBvbmVudHNbZWRnZVswXVsxXV0KICAgICAgICAgICAgICAgICAgICBmb3IgY29tcCBpbiBjb21wb25lbnRzLmtleXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29tcG9uZW50c1tjb21wXSA9PSBjb21wMik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzW2NvbXBdID0gY29tcDEKICAgICAgICByZXR1cm4gZnJhbWUKICAKCnByaW50KCdTdGFydCcpCnByaW50KGRhdGV0aW1lLm5vdygpKQpteV9kYXRhID0gezE6WygyLCAxMCksICg2LCAxMildLCAyOlsoMSwgMTApLCAoMywgMTEpLCAoNiwgMyldLCAzOlsoMiwgMTEpLCAoNCwgNCksICg1LCA1KSwgKDYsIDEpXSwgNDpbKDMsIDQpLCAoNSwgMyldLCA1OlsoMywgNSksICg0LCAzKSwgKDYsIDgpXSwgNjpbKDEsIDEyKSwgKDIsIDMpLCAoMywgMSksICg1LCA4KV0sIDc6Wyg4LCAxKSwgKDksIDUpLCAoMTAsIDYpXSwgODpbKDcsIDEpLCAoOSwgNCksICgxMCwgMildLCA5OlsoNywgNSksICg4LCA0KSwgKDEwLCAzKV0sIDEwOlsoNywgNiksICg4LCAyKSwgKDksIDMpXX0KZ3JhcGggPSBHcmFwaChteV9kYXRhKQpmcmFtZSA9IGdyYXBoLmdldF9taW5fZnJhbWUoKQpmcmFtZS5wcmludCgpCnByaW50KGRhdGV0aW1lLm5vdygpKQpwcmludCgnRmluaXNoJyk=