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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 1 class Solution {
 2     private boolean isOk(char[][] res, int i, int j, int n){ // 检测位置(i,j)可不可以放置
 3         if (res[i][j] == 'Q') return false;
 4         // 列 与 行
 5         for (int k = 0; k < n; ++k){
 6             if (k != i && res[k][j] == 'Q')
 7                 return false;
 8             if (k != j && res[i][k] == 'Q')
 9                 return false;
10         }
11         // 皇后左上
12         for (int k = 1; i-k >= 0 && j-k >= 0; ++k)
13             if (res[i-k][j-k] == 'Q')
14                 return false;
15         // 皇后右下
16         for (int k = 1; i+k < n && j+k < n; ++k)
17             if (res[i+k][j+k] == 'Q')
18                 return false;
19         // 皇后右上
20         for (int k = 1; i-k >=0 && j+k < n; ++k)
21             if (res[i-k][j+k] == 'Q')
22                 return false;
23         // 皇后左下
24         for (int k = 1; i+k < n && j-k >= 0; ++k)
25             if (res[i+k][j-k] == 'Q')
26                 return false;
27         return true;
28     }
29     // cur:在第cur行放置皇后
30     // lists:存放不同的放置方案
31     private void result(int n, char[][] res, int cur, List<List<String>> lists){
32         if (cur == n){
33             List<String> list = new ArrayList<>();
34             for (int i = 0; i < n; ++i){
35                 list.add(new String(res[i]));
36             }
37             lists.add(list);
38             return ;
39         }
40         for (int i = 0; i < n; ++i){
41             if (isOk(res, cur, i, n)){
42                 res[cur][i] = 'Q';
43                 result(n, res, cur+1, lists);
44                 res[cur][i] = '.';
45             }
46         }
47     }
48
49
50
51     public List<List<String>> solveNQueens(int n) {
52         char[][] res = new char[n][n];
53         /*
54         .:可以放置皇后
55         Q:已经放置皇后
56         -:和已有皇后冲突
57          */
58         for (int i = 0; i < n; i++)
59             for (int j = 0; j < n; j++)
60                 res[i][j] = '.';
61         List<List<String>> lists = new ArrayList<>();
62         result(n, res, 0, lists);
63         return lists;
64     }
65 }
01-22 15:41