2010-11-21 30 views
0

问题如下:流浪者开始在网格坐标(x,y)上并希望到达坐标(0,0)。从每个网格点,流浪者可以向北8步或向南3步或向东5步或向西6步(8N/3S/5E/6W)。BFS算法 - 在约束步骤的网格上最短步行

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

澄清:

  • 无限网格
  • 负坐标被允许
  • 队列(链表或阵列)必须用于
+2

对不起,但我没有找到任何解释你的问题... – 2010-11-21 12:33:41

+0

任何障碍出现在网格?网格的尺寸是多少? – bjskishore123 2010-11-21 12:34:26

+0

你为什么不考虑(8N/3S/5E/6W)。我的意思是为什么只推一次北/南/东/西。这不会改变BFS的答案吗?请解释... – 2011-01-04 22:52:11

回答

-2

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

伪代码:

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

还应当指出的是,执行时间为这个应用程序的增长非常快,所以用小的坐标值测试它。例如,坐标(1,1)给出7个水平的宽度并且需要16384次迭代。

+1

你确定这可以吗?如果你总是按顺序添加到队列N,S,E,W,那么你就会有偏见。每四步完成一次,最终向北移动5个单位,向西移动1个单位。如果你的出发点恰好在(0,0)的北部和西部,你将会离开它。 – miked 2011-01-04 23:03:39

2

的算法没有障碍这个问题将是:

对于每个轴,朝它步骤,直到你对其他的轴位置为0

伪代码:

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

不过,我不明白为什么你需要搜索的路线 - 这并不是说复杂。

+0

是的,没有队列需要。愚蠢的家庭作业问题。 – miked 2011-01-04 23:00:42

1

由于“thejh”表示不需要搜索,但您的任务需要一个。

一种合理的方法是

  1. 分析。对于任意(x,y)起始位置是否全部为?检查允许的移动,你可以看到它们可以组合产生1步的水平移动和1步的垂直移动,所以答案是肯定的(为你的介入提供了这个细节)。

  2. 找出“广度优先搜索”是什么。维基百科是你的朋友(尽管如果你有机会去大学图书馆,我确实推荐帕特里克·亨利·温斯顿的旧版人工智能,它非常好,非常清晰的解释)。尝试一下更简单的问题。

  3. 以几乎相同的方式完成作业的问题。如果遇到任何技术上的C++问题,请到这里询问。

干杯&心连心,

+0

关注点2:这几乎是我发布的原因:)我一直在四处寻找BFS搜索的解释和代码示例,但是当我找不到任何可以掌握的东西时,我发布了这个问题,因为我明白了它提出的问题以及如何使用DFS(深度优先搜索)而不是BFS来实现和解决此问题。 – Gorkamorka 2010-11-21 13:03:47

1

这里是我的答案(其实是建立关闭thejh的回答),其使用队列:

//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); 

这是令人费解的,但遵循的方向。