51.N-Queens(N皇后)
题目:
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入: 4 输出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同的解法。
思路:
这题的思路和之前的N皇后II一样,都是运用回溯法,只是输出较难设置,还有一个重点,是其中存放答案的res,需要在每次计算前clear一下,要不然就无法ac。
N皇后II(https://www.cnblogs.com/blogxjc/p/10890322.html)。
代码:

1 private static boolean col[]; 2 private static boolean line1[]; 3 private static boolean line2[]; 4 private static int answer[]; 5 private static List<List<String>> res = new LinkedList<>(); 6 7 public static List<List<String>> solveNQueens(int n) 8 { 9 col = new boolean[n]; 10 line1 = new boolean[2 * n - 1]; 11 line2 = new boolean[2 * n - 1]; 12 answer = new int [n]; 13 res.clear(); 14 putQueen(n, 0); 15 return res; 16 } 17 18 private static void putQueen(int n, int index) 19 { 20 if (index == n) 21 { 22 List<String> item = new ArrayList<String>(); 23 for(int i = 0; i<answer.length; i++) 24 { 25 StringBuilder sb = new StringBuilder(); 26 for(int j = 0; j<answer.length; j++) 27 { 28 if(answer[i] != j) 29 sb.append('.'); 30 else 31 sb.append('Q'); 32 } 33 item.add(sb.toString()); 34 } 35 res.add(item); 36 } 37 38 39 for (int i = 0; i < n; i++) 40 { 41 if (!col[i] && !line1[i - index + n - 1] && !line2[i + index]) 42 { 43 answer[index] = i; 44 col[i] = true; 45 line1[i - index + n - 1] = true; 46 line2[i + index] = true; 47 48 col[i] = false; 49 line1[i - index + n - 1] = false; 50 line2[i + index] = false; 51 } 52 } 53 }