【发布时间】: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() 正文的伪代码。
我知道的事情:i 和 j 是两块之间的水平和垂直距离。我需要制作一对 for 循环来使它通过每个n(n-1) / 2 比较。 “i”和“j”应该分别是数组索引和数组元素的区别。为了安全起见,我还需要使用Math.abs 来区分差异。因此,在 for 循环中,将 i 和 j 初始化为我提到的差异,然后设置一个 if 检查返回 false 的 if i==j。如果进行了所有的比较并且没有返回 false,则返回 true。
【问题讨论】:
-
在“我知道的事情”之后,您似乎有了解决问题的尝试大纲。您是否尝试为此编写代码?您是否通过一个示例来查看它是否可行?
标签: java arrays algorithm function boolean