以最小方向变化进入网格

时间:2015-09-20 04:38:09

标签: algorithm data-structures

有一个网格,每个单元格包含0或1.有一个机器人可以在网格中水平或垂直移动。机器人和机器人的起始位置。结束位置。在从开始到结束的路径中,可能需要将其方向从水平变为垂直或从垂直变为水平。我们需要找到从头到尾移动机器人所需的最小方向变化次数。从开始到结束可能有多条路径。 1表示墙& 0表示通过。 对于前 -

1 1 1 1 1 1 1
0 0 0 0 0 0 0
1 1 1 1 1 0 0
1 1 1 1 1 1 0

在上面的网格中,如果机器人从(1,0)开始,则单元格&到达(3,6)然后有2条路径 其中一条路径需要3个方向改变&其他路径需要1个方向改变,所以答案是1。 我的方法 - 使用dfs计算从源到目标的每条路径的方向变化。报告方向变化的最小值。但它不适用于大尺寸输入。 如果有人可以提出更好的方法,那么它会有所帮助。

3 个答案:

答案 0 :(得分:2)

阶段1:以明显的方式将网格转换为图表开始:

  1. 网格中值为0的每个方格都是一个节点(不需要图中的墙节点)。
  2. 为表示相邻正方形的节点添加边。此阶段的所有边均值为0
  3. 阶段2:将图表转换为移动图表*的方向。

    查看节点n,我们将其替换为四个迷你节点,每个节点(精神上)代表节点所代表的方形墙。仅当相关正方形具有相邻正方形时,迷你节点之间的边缘才存在。这些边缘上的值可以是0(如果边缘继续方向 - 即从左到右或从上到下)或1(如果边缘"转到角落" - 即右下或右上)。

    完成后,运行Dijkstra或类似的算法。

    *这是我编造的名字,不用谷歌搜索它。

答案 1 :(得分:1)

申请BFS。

  1. 使每个单元格存储当前的遍历方向&然后必须根据方向为相邻节点分配权重。
  2. 如果在任何阶段,您发现节点的值大于上次计算的解算方案的值,或者如果该单元格是死角,则丢弃该单元格。否则将其添加到队列中。

    这应该可以解决问题。

答案 2 :(得分:0)

解决此问题的方法如下:

假设输入网格是

0 0 0 0
0 0 1 1
0 0 0 0
0 0 0 0

start是(1,1),end是(4,4)。

现在从1,1开始标记水平和垂直起始点的所有0元素为VISITED,并将方向更改标记为0.当您访问它们时,将它们放入队列中。 第一次迭代后,网格看起来像

0 V V V
V 0 1 1
V 0 0 0
V 0 0 0

然后我们从队列中获取下一个元素并继续。现在我们将方向变化增加到+1。当我们到达终点时,我们返回最小方向变化。