3.7. n queens
在一个 n 大小的象棋盘中放置 n 个皇后,没有两个皇后可以相互攻击。最常见的 n queens puzzle 是 8 个 queens puzzle,n = 8 :
约束:
- 使用 n 列和 n 行的 chessboard。
- 将 n queens 放在板上。
- 没有两个排队可以相互攻击。queen 可以在同一横向、垂直或诊断行中攻击任何其他排队。
本文档主要使用 4 queens puzzle 作为主要示例。
建议的解决方案可以是:
图 3.1. 错误解决方案,用于 4 queens puzzle
以上解决方案是错误的,因为 queens A1
和 B0
可以相互攻击(因此可以 queens B0
和 D0
)。删除 queen B0
将遵循 "no two queens 可相互攻击"约束,但会破坏 "place n queens" 约束。
以下是正确的解决方案:
图 3.2. 为 Four queens puzzle 的正确解决方案
满足所有限制,因此解决方案正确。
请注意,大多数 n queens puzzles 有多个正确的解决方案。我们将专注于查找特定 n 的正确解决方案,而不是查找特定 n 的可能的正确解决方案数量。
问题大小
n queens 示例的实现没有优化,因为它充当初级示例。然而,它可以轻松地处理 64 queens。随着一些变化,它已被显示,可轻松处理 5000 排队等。
3.7.1. N queens 的域模型 复制链接链接已复制到粘贴板!
这个示例使用域模型来解决四个问题。
创建域模型
良好的域模型可以更轻松地理解和解决您的规划问题。
这是 n queens 示例的域模型:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 计算搜索空间.
Queen
实例有一个Column
(例如: 0 是列 A, 1 is column B, …) 和一个Row
(例如,0 为行 0,1 为行 1, …)。可以根据列和行计算升序行和降序排列的 diagonal 行。
列和行索引从 chessboard 的左上角开始。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查找解决方案
单个
NQueens
实例包含所有Queen
实例的列表。它是通过 Solver 提供并检索到的解决方案
实施。
请注意,在四个 queens 示例中,NQueens getN ()
方法始终返回四。
图 3.3. 适用于 Four Queens 的解决方案
columnIndex | rowIndex | ascendingDiagonalIndex (columnIndex + rowIndex) | descendingDiagonalIndex (columnIndex - rowIndex) | |
---|---|---|---|---|
A1 | 0 | 1 | 1 (**) | -1 |
B0 | 1 | 0 (*) | 1 (**) | 1 |
C2 | 2 | 2 | 4 | 0 |
D0 | 3 | 0 (*) | 3 | 3 |
当两个 queens 共享同一列、row 或 diagonal 行,如 glock 和(**)时,它们可以相互攻击。