【问题标题】:Function checking if no two pieces are on the same diagonal (java)检查是否没有两块在同一对角线上的函数(java)
【发布时间】:2014-04-07 04:31:42
【问题描述】:

我正在尝试创建一个程序来打印出 n-queens 问题的所有解决方案1 <= n <= 13。该程序将从命令行读取整数n,指示要解决的皇后问题的大小。例如,如果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]) 表示的排列没有在相同的对角线,否则将返回 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 检查返回 false 的 if i==j。如果进行了所有的比较并且没有返回 false,则返回 true。

【问题讨论】:

  • 在“我知道的事情”之后,您似乎有了解决问题的尝试大纲。您是否尝试为此编写代码?您是否通过一个示例来查看它是否可行?

标签: java arrays algorithm function boolean


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    (y1-y2)/(x1-x2) 是 1,如果 x1,y1 和 x2,y2 是对角线,则为 -1

    基本上是两个坐标之间的线夹角

    【讨论】:

    • 相当于abs(y1-y2) == abs(x1-x2)。这种形式更明确地与 x 轴距离等于 y 轴距离这一事实相关。 (并避免除法,浮动等......)
    【解决方案3】:

    如果两个元素的和或差相同或模差相同,则两个元素在同一对角线上

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

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

    【讨论】:

      【解决方案4】:

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

      将数组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 次测试和设置,两次(按位实现可能是有益的)。与“pairs”解决方案相比,该解决方案需要对对齐测试进行 78 次评估。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        • 1970-01-01
        • 2011-04-18
        • 2021-06-21
        相关资源
        最近更新 更多