如果没有两个部件位于同一对角线上,则进行函数检查(java)
我试图创建一个程序,打印出所有解如果没有两个部件位于同一对角线上,则进行函数检查(java),java,arrays,algorithm,function,boolean,Java,Arrays,Algorithm,Function,Boolean,我试图创建一个程序,打印出所有解1(y1-y2)/(x1-x2)为1或-1,如果x1,y1和x2,y2是对角的 基本上是两个坐标之间的直线角度拒收测试表明水平距离和垂直距离相等 Abs(A[J] - A[I]) == Abs(J - I) 您将尝试每个不同的(I,J)对。如果确保I
1(y1-y2)/(x1-x2)
为1或-1,如果x1,y1和x2,y2是对角的
基本上是两个坐标之间的直线角度拒收测试表明水平距离和垂直距离相等
Abs(A[J] - A[I]) == Abs(J - I)
您将尝试每个不同的(I,J)
对。如果确保I
,则不需要第二个Abs
。有一个稍微更有效的解决方案:
将数组D[-n+1..+n-1]
初始化为allfalse
,然后将所有条目D[A[i]-i]
设置为true
。如果发现条目已true
,则检测到对齐。(D
标记每个对角线的占用情况。)
对另一个对角线方向用D[A[i]+i]
重复此操作(使用D[0..2n-2]
)
这是O(n)
在13x13棋盘上,这将需要25次清除,然后是13次测试和设置,两次(按位实现可能是有益的)。与“成对”解决方案相比,校准测试需要78次评估。如果两个元素的和或差相同或模差相同,则它们位于同一对角线上
如果a1(i,j)和b1(k,l)是元件位置:
如果| l-j |=| i-k |它们在同一对角线上
另一种方法是检查i+j=l+k向上的对角线像/或i-j=k-l--向下的对角线像\--如果你需要方向。在“我知道的事情”之后,你似乎有一个解决问题的尝试的轮廓。你试过为这个写代码吗?您是否通过一个示例查看它是否有效?这相当于abs(y1-y2)==abs(x1-x2)
。这种形式更明确地与x轴距离等于y轴距离这一事实相关。(并避免分割、浮动等)
static boolean isSolution(int[] A){
blah blah blah
}
Abs(A[J] - A[I]) == Abs(J - I)