BFS算法 - 具有约束步骤的网格最短步行

时间:2010-11-21 12:31:09

标签: c++ c search breadth-first-search

问题如下:流浪者从网格坐标(x,y)开始,想要到达坐标(0,0)。从每个网格点开始,流浪者可以向北走8步或向南走3步或向东走5步或向西走6步(8N / 3S / 5E / 6W)。

如何使用广度优先搜索找到从(X,Y)到(0,0)的最短路径?

澄清:

  • 无限网格
  • 允许使用负坐标
  • 必须使用队列(链接列表或数组)
  • 没有障碍物

4 个答案:

答案 0 :(得分:2)

此问题的算法是:

对于每个轴,向着它走,直到另一个轴上的位置为0。

伪代码:

while (x!=0) {
  if (x>0) x-=6;
  else x+=5;
}
while (y!=0) {
  if (y>0) y-=8;
  else y+=3;
}

但是,我不明白为什么你需要搜索路线 - 它并不复杂。

答案 1 :(得分:1)

由于“thejh”表示不需要搜索,但是你的作业需要一个。

合理的方法是

  1. 分析。任意(x,y)起始位置都是可能吗?检查允许的移动,你会发现它们可以组合在一起产生一步水平移动和一步垂直移动,所以答案是肯定的(因为你的移交提供了详细信息)。

  2. 弄清楚“广度优先搜索”是什么。维基百科是你的朋友(虽然,如果你有权访问大学图书馆,我确实推荐Patrick Henry Winston的旧人工智能,这是非常好的,非常清晰的解释)。尝试解决一些更简单的问题。

  3. 以同样的方式完成作业的问题。如果您遇到任何技术C ++问题,请在此处询问。

  4. 干杯&第h。,

答案 2 :(得分:1)

这是我使用队列的答案(真的基于你的答案):

//set x to start position
//set y to start position
do {
  if (x<0) Queue.Push(8N);
  if (x>0) Queue.Push(3S);
  if (y<0) Queue.Push(5E);
  if (y>0) Queue.Push(6W);
  while (!Queue.Empty())
  {
    Move(Queue.Pop());
  }
} while (x && y);

这是令人费解的,但遵循指示。

答案 3 :(得分:-2)

我将继续回答我自己的问题以供将来参考。

伪码:

while (true) {
    if (destination reached)
        break;
    addToQueue(go north);
    addToQueue(go south);
    addToQueue(go east);
    addToQueue(go west);
    getNextFromQueue;
}

还应该注意,此应用程序的执行时间非常非常快,因此请使用较小的坐标值进行测试。例如,坐标(1,1)给出7个宽度级别,需要16384次迭代。

相关问题