计算A到B的移动次数

时间:2016-12-07 22:16:39

标签: algorithm

我有以下问题。

在棋盘上,我在一个给定的方格上有一个骑士(以红色显示),我需要找到骑士可以到达另一个方格的路径(以绿色显示)。 enter image description here

我必须找到最短的路径,同时遵守国际象棋骑士的运动规则(L形动作)并计算动作的数量:

像这样:

enter image description here 我尝试了不同的东西,但没有成功。

我该怎么办?

3 个答案:

答案 0 :(得分:4)

您希望在有限的时间内解决问题,并希望支持简短的解决方案。您应该使用breadth-first search算法,尝试从起点开始的所有可能的移动。忽略将骑士带到已经访问过的方格的移动。

一旦到达目的地点,您就知道您不必搜索更长的解决方案,但您只需完成与第一个解决方案相同长度的所有可能解决方案的列举。

答案 1 :(得分:1)

我没有在线检查以找到任何启​​发式方法,但我可以给你一些内部提示:

如果骑士不在角落里,骑士实际方格对角线上的每个方格只能在两个动作中到达。正方形(x,y)到正方形(x-1,y + 1),(x + 1,y + 1),(x + 1,y-1)和(x-1,y-1)取2移动;

  • 实际广场上方,上方,右方和左方的方块需要3次移动; 实际正方形对角线上的每个正方形与它们之间有一个正方形(例如实际正方形= c4,目标正方形a6),需要4次移动。

  • 实际正方形对角线上的每个正方形(它们之间有2个正方形)(例如实际正方形= c4,目标正方形f7),只需要2次移动。

  • 最后,如果您在给定的颜色方块中,您将采用奇数个移动来到达相反的颜色方块。如果目标方块的颜色与您现在使用的方形颜色相同,则需要进行偶数次移动。

  • 8x8棋盘中骑士从给定位置到另一个位置的步数最多为6。

我认为你可以制作一种算法,结合上述启发式算法,并采用广度优先搜索算法,G. Sliepen提到它。

来自answerhttp://math.stackexchange.com也可能对您有所帮助。你也可以用O(1)解决方案找到很多好的答案here

答案 2 :(得分:0)

动态编程解决方案具有以下重复描述:

DP(x,y)= 1 + min(
              DP(x-2,y-1),DP(x-2,y+1),DP(x+2,y-1),DP(x+2,y+1),
              DP(x-1,y-2),DP(x-1,y+2),DP(x+1,y-2),DP(x+1,y+2)
          ); 

如果我没弄错的话,会要求O(N ^ 2)进行记忆。