Algorithm 使用'进行一维路径查找;传送机'; 问题

Algorithm 使用'进行一维路径查找;传送机'; 问题,algorithm,path-finding,Algorithm,Path Finding,我想写一个简单的1D RTS游戏,有以下路径查找问题: 有许多一维线,到处都是传送带,它们可以在线之间传送,也可以在当前线内传送。传送机是在线路之间传送的唯一方式。什么算法或伪代码可用于确定直线li1上的位置po1到直线li2上的位置po2之间的最短路径?我们有一组传送机T(每个传送机都有一个po和li),它们以零成本相互连接 为什么不是一个*或Dijkstra算法 这是因为我认为这在1D中是一种过度杀伤力 澄清 这听起来可能有点二维,但这不是因为你只能在一条线上向左或向右移动 到传送者那里旅

我想写一个简单的1D RTS游戏,有以下路径查找问题: 有许多一维线,到处都是传送带,它们可以在线之间传送,也可以在当前线内传送。传送机是在线路之间传送的唯一方式。什么算法或伪代码可用于确定直线li1上的位置po1到直线li2上的位置po2之间的最短路径?我们有一组传送机T(每个传送机都有一个po和li),它们以零成本相互连接

为什么不是一个*或Dijkstra算法 这是因为我认为这在1D中是一种过度杀伤力

澄清
  • 这听起来可能有点二维,但这不是因为你只能在一条线上向左或向右移动
  • 到传送者那里旅行是有成本的,但是从一个传送到另一个传送是没有成本的。 请参见此ascii艺术:
…0…s…0 ……0.x。。。 这里,从起点s到目标x的最短距离为

  • 去右边的传送机
  • 向下传送一行(仅在此图中;实际上飞机是无序的)
  • 然后直接到达目标(最终成本=5)

你可以从任何一台传送机或其他传送机传送?在这种情况下,只有两种可能的方式:从起始位置向右和向左。一旦你到达一个传送机,去离目的地最近的传送机。完成。好的,如果你不知道哪个传送机离目的地最近,你可以在同一个平面上尝试它们,但是仍然可以。

< P>因为移动左或右,你只能击中另一个传送端口,你可以基本上考虑每个传送端口都连接到它的左边和右边,在传送端口的两边;所以每个传送带都连接到其他四个传送带


这只会生成一个每个节点最多有四条边的图。所以,只需在内存中构建该图,并使用Dijkstra算法解决您的问题(这并不过分,因为我们不再“在”一维中)。这将比@Jakob建议的暴力算法快得多。

我相信你可以通过结合从起点搜索和从终点搜索来改进Jakob的答案

在你的第一步,从起点开始,考虑2条搜索路径。 一条向左走的路和一条向右走的路

每次迭代在两条路径上进行一步,直到在其中一条路径上

  • 。。。你点击x(搜索,这是最短路径)
  • 。。。你击中了传送机
  • 在案例(2)中,在尚未击中传送机的路径上做一个标记

    现在从终点x开始,并开始搜索两条路径。所以向左和向右,每次迭代一步。 现在又有两种可能的结果:

  • 你击中了标记点->最短路径从起点到标记方向,到达终点时没有传送装置
  • 你点击了一个传送机->你的最短路径是从起点到步骤(2)中的传送机,然后从步骤(4)中的传送机到终点x

  • 这将在2n步中找到最短路径,其中n是该路径的长度。(因为你总是朝两个方向看)。

    平面现在是一维的了吗?据我所知,你有一个三维拓扑,或者只是一个简单的无向图。嗯,这听起来像是二维的。如果成本为0,那么如何定义最短路径?最少的远程传送?那么BF搜索应该可以做到这一点:-请澄清这是否不是你需要的。@IVlad,我想他的意思是一台传送机的两端互相连接,成本为零@Mafi,如果你真的是指1D,那么你不应该说线而不是平面吗?也许你的意思是,它们是游戏世界中的(部分)平面,但在“边缘透视”中,它们显示为水平线,只提供1度的运动?如果你沿着一条线旅行,来到一个传送带,你有选择是否接受它吗?也就是说,有没有可能在没有远程传送的情况下走过它?@LarsH很抱歉把它和“飞机”混淆了。英语不是我的母语。我知道,但是一条正常的路径(即不传送)可能比传送的路径短,或者可能有你无法通过的物体。在我看来,后者是有问题的。障碍物?你正在重新定义这个问题。。。否则,如果源和目的地在同一平面上,您有两个选项“它们之间的直线”和“如果源和目的地之间至少有两条直线,则使用传送机在它们之间的直线”。经过一些思考,您完全正确。忽略我的最后一篇文章和“对象”。不管怎么说,我真丢脸…@Justin,但是要检查的路径数量非常有限,所以不管怎么说都是O(1)。 ...0....s..0 ......0.x...