n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 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