思路:
要求简化为:任何两个皇后都不能在同一行、同一列以及同一条斜线上(包括正对角线和反对角线)。
从行row开始递增,设置三个集合记录列位置,正对角线位置,反对角线位置。
方向一的斜线(正对角线)为从左上到右下方向,同一条斜线上的每个位置满足行下标与列下标之差相等,例如 (0,0) 和 (3,3) 在同一条方向一的斜线上。因此使用行下标与列下标之差即可明确表示每一条方向一的斜线。
方向二的斜线(反对角线)为从右上到左下方向,同一条斜线上的每个位置满足行下标与列下标之和相等,例如 (3,0) 和 (1,2) 在同一条方向二的斜线上。因此使用行下标与列下标之和即可明确表示每一条方向二的斜线。
每次放置皇后时,对于每个位置判断其是否在三个集合中,如果三个集合都不包含当前位置,则当前位置是可以放置皇后的位置。
代码:
leetcode链接面试题 08.12. 八皇后 - 力扣(LeetCode)
//N皇后问题求解
public class Solution {
//判断一个位置所在的列和两条斜线上是否已经有皇后,使用三个集合
// columns、diagonals1 和 diagonals2
//