LeetCode--051--N皇后(java and python)-star

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

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

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

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例:

输入: 4
输出: [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

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

思路:
按上述解法1queens数组为[1,3,0,2] 因为没以行就一个queens所以不用考虑行了,只纪录该行哪一列放了Q
先建立queens数组(建立好后用addSolution填好Q和point),用回溯的方法,把所有满足题意的方式都穷举出来.
TIME:O(N^N)?
SPACE:O(N)
 1 class Solution {
 2     public List<List<String>> solveNQueens(int n) {
 3         List<List<String>> res = new ArrayList<>();
 4         if(n <= 0)return res;
 5         
 6         helper(res,new int[n],0);
 7         return res;
 8     }
 9     public void helper(List<List<String>> res,int[] queens,int pos){
10         if(pos == queens.length){
11             addSolution(res,queens);
12             return;
13         }
14         
15         for(int i = 0;i < queens.length;i++){
16             queens[pos] = i;
17             if(isValid(queens,pos)){
18                 helper(res,queens,pos+1);
19             }
20         }
21     }
22     public boolean isValid(int[] queens,int pos){
23         for(int i = 0;i < pos;i++){
24             if(queens[i] == queens[pos]){//在同一列
25                 return false;
26             }else if(Math.abs(queens[pos] - queens[i]) == Math.abs(i - pos)){//在同一对角线上
27                 return false;
28             }
29         }
30         return true;
31     }
32     public void addSolution(List<List<String>> res ,int[] queens){
33         List<String> list = new ArrayList<>();
34         for(int i = 0;i < queens.length;i++){
35             StringBuilder sb = new StringBuilder();
36             for(int j = 0;j < queens.length;j++){
37                 if(queens[i] == j){
38                     sb.append('Q');
39                 }else{
40                     sb.append('.');
41                 }
42             }
43             list.add(sb.toString());
44             
45         }
46         res.add(list);
47     }
48 }

 2019-05-08 20:51:23

python版本,秒杀java

 1 class Solution:
 2     def solveNQueens(self, n: int) -> List[List[str]]:
 3         def DFS(queens,xy_dif,xy_sum):
 4             p = len(queens)
 5             if p == n:
 6                 result.append(queens)
 7                 return None
 8             for q in range(n):
 9                 if q not in queens and p-q not in xy_dif and p+q not in xy_sum:
10                     DFS(queens+[q],xy_dif+[p-q],xy_sum+[p+q])
11         result = []
12         DFS([],[],[])
13         return [["."*i + "Q" + "."*(n-i-1) for i in sol]for sol in result]
14                 

2020-01-13 16:38:14

posted @ 2019-05-08 20:55  Assange  阅读(286)  评论(0编辑  收藏  举报