N皇后II
1.解法一
判断一个位置是否有效主要依据以下四点,第一点其实可以不用判断
- 每一行上,皇后是否出现一次以上
- 每一列上,皇后是否出现一次以上
- 每一斜对角线(从左上到右下),****
- 每一斜对角线(从右上到左下),****
因此,可用四个数组,存储以上四种情况,N个皇后
- vectorr(n,false)
- vectorc(n,false)
- vectorld(2 * n + 1,false)
- vectorrd(2 * n + 1,false)
而ld有如下性质:在同一斜线上的点,行号列号之差的绝对值相等,例如下面的X,可以加上N-1来补偿,这样使 [0,3] 所在的斜线为第一条,依次往上直到第七条。所以判断某一斜线上是否有点为 ld[row - col + n - 1] == false
0 1 2 3 0 O O O O 1 X O O O 2 O X O O 3 O O X O
rd有如下性质:同一斜线上的点,行号与列号之和相等,判断某一斜线上是否有点的条件是 rd[row + col] == false
0 1 2 3 0 O O X O 1 O X O O 2 X O O O 3 O O O O
由此,行号为参数,for循环每次都从某一行的第一列开始检查合法位置,如果某一列有效,对下一行进行递归。
代码如下:
class Solution {
public:
int totalNQueens(int n){
vcol.resize(n, true);
rd.resize(n + n - 1, true);
ld.resize(n + n - 1, true);
vector<string>tmp(n, string(n, '.'));
back_track(tmp, n, 0)<