C++ 对以下c/c+的逻辑解释+;解决方案
有人能向我解释一下为什么在以下解决方案中使用GCD: (适用于c) (对于c++) 关于问题: 狙击手站在2D XY平面上的点(x1,y1)。他从他的位置向点(x2,y2)射击。您可以假设所有点都是整数 考虑由XY平面上的整数点形成的二维栅格。狙击手和目标的位置是该网格中的晶格点。狙击手射出的子弹将沿着(x1,y1)到(x2,y2)的直线轨迹飞行。子弹的射程不超过(x2,y2) 考虑当狙击手站在(1,1)并且目标位于(4,3)时子弹的轨迹 注意子弹的轨迹是如何触及4个单元格的。当且仅当子弹将进入单元时,单元被视为轨迹接触。子弹的轨迹接触了多少个细胞  输入 第一行包含一个整数T,即测试用例数。以下T行中的每一行都包含一个测试用例。每个测试用例包含4个整数x1、y1、x2和y2。整数由单个空格字符分隔。 输出 对于每个测试用例,输出一行,其中包含子弹射程从(x1,y1)到(x2,y2)接触的单元数。记住,当且仅当子弹进入细胞时,细胞才被视为被轨迹接触-仅接触一侧是不够的。 约束条件 0C++ 对以下c/c+的逻辑解释+;解决方案,c++,c,algorithm,math,geometry,C++,C,Algorithm,Math,Geometry,有人能向我解释一下为什么在以下解决方案中使用GCD: (适用于c) (对于c++) 关于问题: 狙击手站在2D XY平面上的点(x1,y1)。他从他的位置向点(x2,y2)射击。您可以假设所有点都是整数 考虑由XY平面上的整数点形成的二维栅格。狙击手和目标的位置是该网格中的晶格点。狙击手射出的子弹将沿着(x1,y1)到(x2,y2)的直线轨迹飞行。子弹的射程不超过(x2,y2) 考虑当狙击手站在(1,1)并且目标位于(4,3)时子弹的轨迹 注意子弹的轨迹是如何触及4个单元格的。当且仅当子弹将进
0解决方案背后的逻辑是: 子弹沿X轴穿过的块数,加上
子弹沿Y轴穿过的块数减去
超出计数的块数 给定点
(X1,Y1)
和(X2,Y2)
,让A1=abs(X1-X2)
和A2=abs(Y1-Y2)
。然后,在不失一般性的情况下,我们可以考虑点<代码>(0, 0)<代码> >代码>(A1,A2)< /代码> ./P>
请注意,A1
表示项目符号沿X轴穿过的块数。但是,这也是项目符号在网格上间隔(0,A1]
上接触的垂直线的数量。类似地,A2
表示项目符号沿Y轴穿过的块的数量,以及项目符号在间隔(0,A2]
上接触的水平线的数量
当被视为接触线的数量时,更容易理解为什么需要减去一些数字。需要减去的数字是与垂直线和水平线交叉处发生的接触相对应的数字。发生的数量由
A1
和A2 。特别是,它发生在中k
的点(k*A1/GCD(A1,A2),k*A2/GCD(A1,A2))
,解决方案背后的逻辑是:
子弹沿X轴穿过的块数,加上
子弹沿Y轴穿过的块数减去
超出计数的块数
给出了点<代码>(x1,y1)< /> >和<代码>(x2,y2)< /代码>,让<代码> A1= ABS(X1-X2)和<代码> A2= ABS(Y1-Y2)。然后,在不失一般性的情况下,我们可以考虑点<代码>(0, 0)< /代码>和<代码>(A1,A2)< /代码> .<
请注意,
A1
表示项目符号沿X轴穿过的块数。但这也是项目符号在间隔(0,A1)
在网格上。类似地,A2
表示项目符号沿Y轴穿过的块数,以及项目符号在间隔(0,A2)
上接触的水平线数
当被视为接触线的数量时,更容易理解为什么需要减去一些数字。需要减去的数字是与垂直线和水平线交叉处发生的接触相对应的数字。发生的数量由A1
和A2 特别是,它发生在的(k*A1/GCD(A1,A2),k*A2/GCD(A1,A2))
中k
的点。在解释使用GCD
背后的逻辑之前,我想澄清这可能不是本代码作者所想的确切方式。
首先,我看不到该代码中使用了max
函数。
说明:
让我们假设
狙击手在(0,0)
处,目标在(3,3)
处。很明显,子弹的轨迹将接触2个单元。
备注:当狙击手和目标位于直线x=y
或与之平行时,所接触的单元格比纵坐标(或横坐标)的单元格少一个。(这等于子弹移动距离的x
和y
分量之和,减去子弹移动距离的x
和y
分量的GCD。)
狙击手在(0,0)
处,目标在(0,3)
或(3,0)
处。同样,通过图片可以清楚地看到,子弹的轨迹将接触0
单元格。
备注:当狙击手和目标在x
或y
线上或与x
或y
平行时,接触的单元格为一个0
。(这等于子弹移动距离的x
和y
分量之和,减去子弹移动距离的x
和y
分量的GCD。)
鹬