То, что вы ищете, это простой цикл .Пакет теории графов networkx
предоставляет метод для нахождения в simple_cycles
.Все, что нам нужно сделать, это чуть-чуть поработать над настройкой графика:
import networkx as nx
def has_simple_cycle(l, start):
G = nx.DiGraph()
G.add_edges_from((v1, v2) for v1 in l for v2 in l if v1 != v2 and max(abs(v1[0] - v2[0]), abs(v1[1] - v2[1])) <= 1)
return any(start in c and len(c) > 2 for c in nx.simple_cycles(G))
В приведенных вами примерах:
In [26]: has_simple_cycle(l=[(0, 0), (0, 1), (1, 2), (2, 3), (3, 3), (3, 4), (4, 4), (3, 2), (3, 1), (3, 0), (2, -1), (1, -1), (0, -1)], start=(0, 0))
Out[26]: True
In [27]: has_simple_cycle(l=[(0, 0), (0, 1), (1, 2), (2, 3), (3, 3), (3, 4), (4, 4), (3, 2), (3, 1), (3, 0), (2, -1), (0, -1)], start=(0, 0))
Out[27]: False