【问题标题】:Minimum Knight moves to go from one square to another [duplicate]最小骑士从一个方格移动到另一个方格[重复]
【发布时间】:2013-10-21 01:43:33
【问题描述】:

是否有一个数学公式可以用来计算在无限二维网格中的两点之间移动的最小骑士移动数?我可以使用广度优先搜索来解决这个问题,但是我们可以使用封闭形式的表达式吗?

谢谢!

【问题讨论】:

  • 网格是有限的还是无限的?我猜对于无限网格,可以从原点开始可视化 BFS 树,并尝试提出一个描述它的公式。但是对于有限的网格,边界可能会导致很多特殊情况。
  • 我们可以假设网格是无限的
  • 我相信这就是您正在寻找的答案:stackoverflow.com/a/8778592/1729005

标签: math min shortest-path


【解决方案1】:

我认为没有一个公式可以为所有点对生成最小距离。

但是对于一些特殊点是有的。 让 A,B 成为 2D 上的点 - 网格中 A = (0,0)B = (x,y)dist(x,y) 骑士移动的最小数量。

首先,距离是对称的:

dist(x,y) = dist(-x,y) = dist(x,-y) = dist(-x,-y) = dist(y,x)

  1. 案例:2x=y -> dist(x,2x) = x
  2. 案例:x = 0
    • 子案例 1:y = 4k(k 是自然数)
      -> dist(x,y) = 2k
    • 子案例 2:y = 4k+1y = 4k+3
      -> dist(x,y) = 2k + 3
    • 子案例 3:y = 4k+2
      -> dist(x,y) = 2k + 2
  3. 案例:x = y
    • 子案例 1:x = 3k(k 是自然数)
      -> dist(x,y) = 2k
    • 子案例 2:x = 3k+1
      -> dist(x,y) = 2k + 2
    • 子案例 3:y = 3k+2
      -> dist(x,y) = 2k + 4

如果 B(带有0 <= x <= y)在任何情况下都不适合,你至少知道
dist(x,y) <= dist(x-k,y-2k) + dist(k,2k) = dist(0,y-2k) + k

dist(x,y) <= dist(x-z,y-z) + dist(z,z) = dist(0,y-z) + dist(z,z)

编辑: 我已经考虑了更多。我认为以下算法计算最小移动(Maple Code):

dist := proc(x,y)
  global d;
  local temp;

  if x < 0 then x:= -x; fi;
  if y < 0 then y:= -y; fi;
  if x > y then temp := x; x:= y; y:= temp; fi;

  if y = 2*x then return x; fi;
  if x = y then 
    if x mod 3 = 0 then return 2*(x/3); fi;
    if x mod 3 = 1 then return 2+2*(x-1)/3 fi;
    if x mod 3 = 1 then return 4+2*(x-2)/3 fi;
  fi;
  if x = 0 then
    if y mod 4 = 0 then return y/2; fi;
    if y mod 4 = 1 or y mod 4 = 3 then return 3+(y - (y mod 4))/2; fi;
    if y mod 4 = 2 then return 2+(y-2)/2; fi;
  fi;
  if y > 2*x then
    return dist(0,y-2*x) + dist(x,2*x);        
  else
    return dist(2*x-y,2*x-y) + dist(y-x,2*(y-x));
  fi;
end proc:

注意:这仅适用于无限的 2D 网格。

EDIT2:这个(递归)算法在O(1)(时间和空间)中运行,因为它有恒定数量的O(1) 操作,最多再调用一次。 p>

EDIT3:我想得更远一点,我认为这在有限的 2D 网格上也是正确的,如果 AB 与至少 1 行/列相距至少 1 行/列边框。

【讨论】:

  • 在最后两种情况下(在 Maple 代码中),这两个返回语句应该交换。
  • @DarkTurtle 感谢您指出这一点。我修好了。
猜你喜欢
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多