leetcode 52. N皇后 II

Posted yfs123456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 52. N皇后 II相关的知识,希望对你有一定的参考价值。

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 

 

以上是关于leetcode 52. N皇后 II的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 52. N皇后 II

算法leetcode每日一练52. N皇后 II

[leetcode] 52. N皇后 II

Leetcode No.52 N皇后 II

leetcode#52 N queensⅡ

LeetCode52. N皇后 II