Я пытаюсь написать сценарий в python, чтобы решить какой-то лабиринт с несколькими начальными точками и несколькими конечными точками. Правильный путь получается по прямым линиям от начальной точки.Python: разрешить лабиринт n-to-n
Например лабиринт с 4-мя путями:
Сначала я думал, что с помощью правила левой/правой руки, но это не имеет большого смысла из-за характеристик лабиринта. Я попытался сделать алгоритм, чтобы следовать прямым линиям, следуя 4 направлениям (вверх, вниз, влево, вправо).
То, что я на данный момент:
from PIL import Image
UP='up'
DOWN='down'
LEFT='left'
RIGHT='right'
directionOld=RIGHT
def checkAdjacents(im,x,y):
matrix=[]
for Y in range(y-1,y+2):
r=[]
for X in range(x-1,x+2):
if im.getpixel((X,Y))==255:
r.append(True)
else:
r.append(False)
matrix.append(r)
return matrix
def testDirection(adj,direction):
if direction==UP and adj[0][1]:
return False
if direction==LEFT and adj[1][0]:
return False
if direction==RIGHT and adj[1][2]:
return False
if direction==DOWN and adj[2][1]:
return False
return True
def changeDirection(adj,direction):
if direction==UP or direction==DOWN:
if adj[1][2]:
direction=RIGHT
else:
direction=LEFT
else:
if adj[2][1]:
direction=DOWN
else:
direction=UP
return direction
def move(im,im2,x,y,directionOld,color):
im2.putpixel((x,y),color)
adj=checkAdjacents(im,x,y)
change=testDirection(adj,directionOld)
directionNew=directionOld
if change:
directionNew=changeDirection(adj,directionOld)
print "New direction ->",directionNew
if directionNew==UP:
y-=1
elif directionNew==DOWN:
y+=1
elif directionNew==RIGHT:
x+=1
else:
x-=1
return (x,y,directionNew)
image_file = Image.open("maze.png") # open colour image
im = image_file.convert('1') # convert image to black and white
im.save("2.png")
im2=im.copy() #duplicate to store results
im2=im2.convert("RGB") #results in color
paths=[(114,110,(255,0,255)),#Path1
(114,178,(255,0,0)),#Path2
(114,250,(0,255,0)),#Path3
(114,321,(0,0,255)),#Path4
]
for path in paths:
print "------------------------------------"
print "----------------Path"+str(paths.index(path))+"---------------"
print "------------------------------------"
x,y,color=path
for i in range(0,750):#number of steps
x,y,directionOld=move(im,im2,x,y,directionOld,color)
im2.save("maze_solved.png")
Исходное изображение представляет собой черно-белое изображение, как это:
Что дает:
Я думал о usi что-то похожее, но добавив еще 4 направления, соответствующие диагональному направлению.
Любые другие идеи для получения хороших результатов?
Это кажется интересной проблемой. Я думаю, что ключевое понимание состоит в том, что «прямые линии» означают через пересечение, не обязательно в кардинальных направлениях. Я играю с реализацией, которая начинается в точке X и перемещается по прямой, пока путь не будет указан по этой линии, и в это время он выбирает новую строку. Еще один интересный подход - использовать детектор линии и построить сеть линий. – Chris