到坐标的可能路径

时间:2019-04-04 16:23:48

标签: algorithm traversal

我最近接受了一次采访,我的算法仅通过了除一个以外的所有测试用例,我不知道为什么。我需要解决的问题是:

给定2D网格中的站立点(a,b),是否可以到达目标点(x,y)。他唯一能做的就是从某点(a,b)移至点(a + b,b)或(a,a + b)。

我试图通过使用gcd解决它。例如如果gcd(a,b)= gcd(x,y),则有可能,否则不可能。直觉是,如果k是a&b的gcd。那么,k也将除以(a + b)。我使用以下算法来计算gcd:

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}

编辑:而且数字a,b,x和y都是正整数。

2 个答案:

答案 0 :(得分:1)

GCD(3,7)= GCD(7,3),但两个都无法访问。您的条件是必要的,但还不够。

请注意,每个点都有一个独特的可能的前任。即对于点(a,b),如果a> b,则前任为(a-b,b),否则前任为(a,b-a)。

答案 1 :(得分:0)

您现在对帖子有2个问题:

  1. 如何求解算法?
    Photon的{​​{3}}涵盖了这一点。
  2. GCD为什么不起作用?

GCD是必要条件,但不是充分条件。

如果a = b,则仅当GCD(x,y)= a = b时(x,y)才可到达。但是,这并不能推广到所有问题对。琐碎的反例试图从(N,1)达到(1,N),其中N> 1。另一个是(2,3)=>(4,5)。


因此,让我们进入定性部分:“我不知道...”。我怀疑问题出在哪里,您会看到Euclid算法与加法步骤之间存在相似之处。甚至更强大的是,链接中的“向后”算法表明使用了欧几里得算法。

它可以在某种程度上,但不像您尝试使用它那样简单和普遍。将问题视为笛卡尔平面中正整数格上的一个图。允许的操作(有向边)定义了如何从一个点移动到另一个点。

这里的关键术语是 directed :一旦从起点“移动”到定义系统中的GCD的地方,您没有自由地追溯这些步骤。您可以在图形空间中向前或向后移动

例如,尽管向后过渡允许您从(4,1)移至(1,1)或从(1,4)移至(1,1),但您不能使用以此得出从(4,1)到(1,4)的路径:这些移动的一半在不允许的方向上。


这有助于消除混乱吗?