from random import shuffle
n, m = 20, 250 # размер поля, количество дыр
row = [0] * m + [1] * (n * n - m)
shuffle(row)
field = [row[i:i + n] for i in range(0, n * n, n)]
def show():
for r in field:
print('[', *[(' ', '██', '░░')[cell] for cell in r], ']', sep='')
print()
show()
# BFS https://ru.wikipedia.org/wiki/Поиск_в_ширину
row, nxt = field[0], []
for x, cell in enumerate(row):
if not cell:
nxt.append((0, x))
row[x] = 2
while nxt:
cur, nxt = nxt, []
for y, x in cur:
for y1, x1 in (y, x - 1), (y, x + 1), (y - 1, x), (y + 1, x):
if 0 <= y1 < n > x1 >= 0 == field[y1][x1]:
field[y1][x1] = 2
nxt.append((y1, x1))
show()
{
....
(x, y): [(x-1,y), (x+1, y), (x, y-1), (x, y+1)]
....
}
v >= 0 <= w
. Можно построить путь уголком, (v, 0) -> (0, 0) -> (0, w)
. А теперь просто повернём вторую часть пути, (v, 0) -> (0, 0) -> (-w, 0)
, как-будто повернули минутную стрелку часов, а часовую не тронули. Совокупная длина стрелок v + w
как была, так и осталась. Разве не очевидно?