n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。  上图为 8 皇后问题的一种解法。 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。 每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
 
 
 示例: 输入:4 输出:[ [".Q…", // 解法 1 “…Q”, “Q…”, “…Q.”], ["…Q.", // 解法 2 “Q…”, “…Q”, “.Q…”] ] 解释: 4 皇后问题存在两个不同的解法。 提示: 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
 
 
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/n-queens
 
【回溯】
 
public List
<List
<String>> solveNQueens(int n
) {
        
        int[] queen 
= new int[n
];
        Arrays
.fill(queen
,-1);
        List
<List
<String>> solution 
= new ArrayList<>();
        solve(solution
,queen
,n
,0,0,0,0);
        return solution
;
    }
    private void solve(List
<List
<String>> solution
,int[] queen
,int n
,int row
,int col
, int dia1
,int dia2
) {
        if (row 
== n
){
            solution
.add(generate(queen
));
        }else {
            
            int availablePositions 
= ((1<<n
)-1) &(~(col
|dia1
|dia2
));
            while (availablePositions
!=0){
                
                int position 
= availablePositions 
& (-availablePositions
);
                
                availablePositions 
&= (availablePositions 
- 1);
                
                queen
[row
] = Integer
.bitCount(position
-1);
                solve(solution
, queen
, n
,row
+1, col 
| position
, (dia1 
| position
) >> 1, (dia2 
| position
) << 1);
                
                queen
[row
] = -1;
            }
        }
    }
    private List
<String> generate(int[] queen
) {
        int len 
= queen
.length
;
        List
<String> ans 
= new ArrayList<>();
        for (int value 
: queen
) {
            char[] res 
= new char[len
];
            Arrays
.fill(res
, '.');
            res
[value
] = 'Q';
            ans
.add(new String(res
));
        }
        return ans
;
    }