zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    全基因组关联分析学习资料(GWAS tutorial)
    GWAS研究可利用的数据库(20200424更新)
    本周最新文献速递20200614
    本周最新文献速递20200607
    甲基化数据QC: 使用甲基化数据推测SNP基因型(ewastools工具)
    文献速递20200531
    查找感兴趣的基因、基因组区域是否有调控元件的在线网页工具EpiRegio
    许嵩
    甲基化数据QC:使用甲基化数据计算样本间的相关性
    there is no package called 'GO.db'报错解决方案
  • 原文地址:https://www.cnblogs.com/NPC-assange/p/10834599.html
Copyright © 2011-2022 走看看