题目描述[原题链接][https://leetcode-cn.com/problems/n-queens-ii/]
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给定一个整数 n,返回n 皇后不同的解决方案的数量。
示例:
输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
[“.Q..”, // 解法 1
“…Q”,
“Q…”,
“..Q.”],[“..Q.”, // 解法 2
“Q…”,
“…Q”,
“.Q..”]
]
算法描述
在建立算法之前,我们来考虑两个有用的细节。
一行只可能有一个皇后且一列也只可能有一个皇后。
这意味着没有必要再棋盘上考虑所有的方格。只需要按列循环即可。
对于所有的主对角线有
行号 + 列号 = 常数
,对于所有的次对角线有行号 - 列号 = 常数
.
这可以让我们标记已经在攻击范围下的对角线并且检查一个方格 (行号, 列号)
是否处在攻击位置。
现在已经可以写回溯函数 backtrack(row = 0)
.
从第一个 row = 0
开始.
循环列并且试图在每个 column
中放置皇后.
如果方格 (row, column)
不在攻击范围内
在(row, column)
方格上放置皇后。
排除对应行,列和两个对角线的位置。
如果所有的行被考虑过,row == N
,意味着我们找到了一个解
否则继续考虑接下来的皇后放置 backtrack(row + 1)
.
回溯:将在 (row, column)
方格的皇后移除.
C++代码
1 | class Solution { |
Java代码
1 | class Solution { |