我有一个矩阵:
GroupBy
1-障碍物
0-常规单元格
我想实现一种算法,用于找到两个选定像元之间的最短路径(如果不能对角线的话)。我尝试了A *算法,但未给出正确的结果:
from cmath import rect, phase
from math import radians, degrees
def meanAngle(deg):
complexDegree = sum(rect(1, radians(d)) for d in deg) / len(deg)
argument = phase(complexDegree)
meanAngle = degrees(argument)
return meanAngle
def meanTime(times):
t = (time.split(':') for time in times)
seconds = ((float(s) + int(m) * 60 + int(h) * 3600)
for h, m, s in t)
day = 24 * 60 * 60
toAngles = [s * 360. / day for s in seconds]
meanAsAngle = meanAngle(toAngles)
meanSeconds = meanAsAngle * day / 360.
if meanSeconds < 0:
meanSeconds += day
h, m = divmod(meanSeconds, 3600)
m, s = divmod(m, 60)
return('%02i:%02i:%02i' % (h, m, s))
print(meanTime(["15:00:00", "21:00:00"]))
# 18:00:00
print(meanTime(["23:00:00", "01:00:00"]))
# 00:00:00
请告诉我如何用Python语言实现它,以便其正常工作。
答案 0 :(得分:1)
以下是您的问题的BFS实现:https://ideone.com/tuBu3G 我们从感兴趣的起点开始排队,并在到达终点后停止。在迭代的每个步骤中,我们的目标都是探索新的未探索状态,并将该新点的距离设置为 1 +该点到其探索位置的距离。
from collections import deque
graph = [[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]]
# To move left, right, up and down
delta_x = [-1, 1, 0, 0]
delta_y = [0, 0, 1, -1]
def valid(x, y):
if x < 0 or x >= len(graph) or y < 0 or y >= len(graph[x]):
return False
return (graph[x][y] != 1)
def solve(start, end):
Q = deque([start])
dist = {start: 0}
while len(Q):
curPoint = Q.popleft()
curDist = dist[curPoint]
if curPoint == end:
return curDist
for dx, dy in zip(delta_x, delta_y):
nextPoint = (curPoint[0] + dx, curPoint[1] + dy)
if not valid(nextPoint[0], nextPoint[1]) or nextPoint in dist.keys():
continue
dist[nextPoint] = curDist + 1
Q.append(nextPoint)
print(solve((0,0), (6,7)))
打印:#13
答案 1 :(得分:0)
这里是一个如何在python 3中实现BFS的示例:
import collections
def breadth_first_search(graph, root):
visited, queue = set(), collections.deque([root])
while queue:
vertex = queue.popleft()
for neighbour in graph[vertex]:
if neighbour not in visited:
visited.add(neighbour)
queue.append(neighbour)
if __name__ == '__main__':
graph = [[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]]
breadth_first_search(graph, 0)
我希望这能对您有所帮助,请让我知道它的进展!