最短路径,最小转弯算法

时间:2012-04-26 07:29:31

标签: algorithm shortest-path

有一个带障碍物的正方形网格 。在该网格上,有一个类Person的两个成员。他们面向某个方向(向上,向右,向左或向下)。每个人都有一定的能量。让人员转动或移动它会消耗能量(转动消耗1个能量单位,移动消耗5个能量单位)。

我的目标是让它们尽可能靠近彼此移动(表示为曼哈顿距离),消耗尽可能少的能量。请记住网格上有障碍物。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

我会使用广度优先搜索并计算最小能量值以达到每个方格。当球员相遇或者没有剩余能量时,它会终止。

答案 1 :(得分:0)

我会做出假设并在以后删除它们。

假设网格小于1000x1000并且你不能耗尽能量......:

假设他们无法互相联系: 对于Person1,Person2,找到它们各自的可到达点集合R1,R2。

(例如使用广度优先搜索)

按R1值对R1和R2进行排序。

现在通过R1和R2找到最接近的点对。 提示:我们对两个数组进行了排序,以便我们知道点的x坐标是否接近。我们永远不必在x坐标上比当前找到的最小值更远。

假设他们可以互相联系:从person1使用BFS,直到找到person2并记录路径

如果使用BFS找到的路径不需要转弯,那么这就是解决方案,

否则:

创建4个网格副本(称为右网格,左网格,上网格,下网格)。

规则是,如果向左移动,则只能在左侧网格中;如果向右移动,则只能在右侧网格中等。要转动,必须从一个网格移动到另一个网格(它使用能量)。

创建此结构,然后使用BFS。

示例:

现在左侧网格假设您向左移动,因此从左侧网格创建一个图形,其中每个点都连接到其左侧的点,并且能够向前移动。

左边网格中唯一的另一个选项是移动到上网格或下网格(使用1个能量),因此从上网格和左网格等连接相应的网格点。

现在您已经构建了图表,只需再次使用广度优先搜索。

我建议你使用pythons NetworkX,它只会有大约20行代码。

如果路上有障碍物,请确保没有连接方块。

祝你好运。