函数检查是否在同一对角线上没有两个部分(java)

时间:2014-03-05 08:27:42

标签: java arrays algorithm function boolean

我正在尝试创建一个程序,打印出n-queens问题的所有解决方案1 <= n <= 13。程序将从命令行读取整数n,指示要解决的Queens问题的大小。例如,如果n = 5它会打印出来

(1, 3, 5, 2, 4)
(1, 4, 2, 5, 3)
(2, 4, 1, 3, 5)
(2, 5, 3, 1, 4)
(3, 1, 4, 2, 5)
(3, 5, 2, 4, 1)
(4, 1, 3, 5, 2)

(4, 2, 5, 3, 1)
(5, 2, 4, 1, 3)
(5, 3, 1, 4, 2)

目前,我只是坚持我的程序的一个功能。我需要创建一个方法,如果由(A [1],A [2],A [3],...,A [n])表示的排列没有放置两个皇后(国际象棋棋子),它将返回true。相同的对角线,否则将返回false。为了检查(A [i],i)和(A [j],j)处的两个皇后是否位于同一对角线上,我需要检查相隔的水平距离是否与它们的垂直距离相同。

该函数名为isSolution(),最多只能对每对皇后进行一次比较。如果在同一对角线上找到一对,则不进行进一步比较并返回false。如果在未发现对角线攻击的情况下执行所有n(n-1) / 2比较,则返回true。

static boolean isSolution(int[] A){
    blah blah blah
}

我已经有了一个函数,它以字典顺序生成集合的所有排列,并将其最终排列设置为原始状态。

isSolution()函数内的内容是什么?我非常迷失,任何事情都会有所帮助,甚至是伪代码,它勾勒出isSolution()的身体。

我知道的事情:ij是两件之间的水平和垂直距离。我需要创建一对for循环,使其经历每次n(n-1) / 2比较。 “i”和“j”应分别是数组索引和数组元素之间的差异。我还需要使用Math.abs来区分差异才能安全。所以在for循环中,初始化ij作为我提到的差异,然后设置if if检查返回false的if i==j。如果进行了所有比较并且未返回false,则返回true。

4 个答案:

答案 0 :(得分:3)

拒绝测试表示水平和垂直距离相等,

Abs(A[J] - A[I]) == Abs(J - I)

您将尝试每个不同的(I, J)对。如果您确定I < J,则不需要第二个Abs

答案 1 :(得分:0)

如果x1,y1和x2,y2是对角线,则

(y1-y2)/(x1-x2)为1或-1

它基本上是两个坐标之间的直线角度

答案 2 :(得分:0)

有一个更有效的解决方案:

将数组D[-n+1..+n-1]初始化为所有false,然后将所有条目D[A[i] - i]设置为true。如果发现条目已经true,则检测到对齐。 (D标记每个对角线的占用率。)

对于另一个对角线方向,使用D[A[i] + i]重复此操作(使用D[0..2n-2])。

这是O(n)

在13x13棋盘上,这将需要25次清除,然后是13次测试和设置,两次(按位实现可能是有益的)。与“对”解决方案相比,该解决方案需要对对齐测试进行78次评估。

答案 3 :(得分:0)

如果两个元素的和或差相同或者mod差异相同,则它们位于同一对角线上

如果a1(i,j)和b1(k,l)是元素位置: 如果| l-j | = | i-k |它们在同一对角线上

另一种方法是检查i + j = l + k向上对角线像/或i-j = k-l - 向下对角线像\ - 如果你需要方向。