n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入: 4 输出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同的解法。
class Solution { Set<Integer> rset; Set<Integer> posset; Set<Integer> negset; int n; public List<List<String>> solveNQueens(int n) { //准备三个HashSet,回溯 List<List<String>> lists = new ArrayList<>(); if(n <= 0) return lists; this.n = n; rset = new HashSet<>(); posset = new HashSet<>(); negset = new HashSet<>(); bt(0,n,new ArrayList<String>(),lists); return lists; } private void bt(int i,int n,List<String> list,List<List<String>> lists){ //达到第n - 1行,退出 if(i == n){ lists.add(new ArrayList<>(list)); return; } //递归模拟行的递增,循环模拟每行上列的增加 for(int j = 0;j < n;j++){ if(!rset.contains(j) && !posset.contains(i - j) && !negset.contains(i + j)){ rset.add(j); posset.add(i - j); negset.add(i + j); char[] s = new char[n]; Arrays.fill(s,'.'); s[j] = 'Q'; list.add(new String(s)); bt(i + 1,n,list,lists); list.remove(list.size() - 1); rset.remove(j); posset.remove(i - j); negset.remove(i + j); } } } }