n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

上图为 8 皇后问题的一种解法。

给定一个整数 n,返回 n 皇后不同的解决方案的数量。

示例:

输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法同leetcode 51,只是统计个个数而已。

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