题目描述
将 n 个皇后放置在 n * n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子防止方案,该方案中 ‘Q’ 和 ‘.’ 分别代表皇后和空位。
分析
参考:https://leetcode-cn.com/problems/n-queens/solution/gen-ju-di-46-ti-quan-pai-lie-de-hui-su-suan-fa-si-/
以 四皇后 为例,给棋盘的每一行从左到右标记为:1、2、3、4。
决策树的每一层表示棋盘上的每一行,每个节点可以做出的选择是:在该行的任意一列放置一个皇后。
画出递归树如下图:
整体就是“全排列” 问题 + 剪枝,剪枝的依据就是 “N皇后” 问题的规则。
思路
皇后可以攻击上、下、左、右、左上、左下、右上、右下8个方向
- 因为是一行一行摆放,因此这些“皇后”一定不在同一行,无需额外设置状态;
- 为了保证不在同一列,需要设置 列标记数组 used[] 作为“状态”变量;
- 为了保证至少两个皇后不同时出现在主对角线或者副对角线,策略是:只要“检测”到新摆放的“皇后”与已经摆放好的“皇后”冲突,就尝试摆放下一个位置,在“无处安放”的时候“剪枝”。
研究一下主对角线(135°)和副对角线(