51. N-Queens
https://leetcode.com/problems/n-queens/
N皇后问题,这里是将花花的讲解翻成 Java 版,花花的讲解已足够简明易懂。
每个棋子在每一行每一列必须是唯一的,这倒还好,关键在于每个棋子的所在斜线和反斜线都不包含棋子。难点就在于如何确认斜线处是否有棋子。而在标准做法中,斜线和反斜线各需要一个布尔数组就可以做到,只要找到 x 及 y 下标关系即可。
从第 0 行开始,确定第 0 行 Q 所在位置,之后递归行数加 1,以此类推。
因为担心递归函数中包含变量太多,故将三个布尔数组作为了全局变量。
1 | boolean[] cols; |
52. N-Queens II
https://leetcode.com/problems/n-queens-ii/
52题和51题是一样的,只是这次是计算个数。这里是将 count 作为全局变量,其实可以将 handle 返回 count,亦或者 handle 在每次满足条件时返回 1,这几种做法皆可。(只要不是犯将 count 放到参数这种低级错误皆可)。
左程云的书 里面还有一种使用位运算做加速的超自然做法,暂且备注一下。
1 | int count = 0; |