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 }