LeetCode 51.N-Queens

51.N-Queens(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     }
View Code
原文地址:https://www.cnblogs.com/blogxjc/p/10892073.html