• [Swift]LeetCode52. N皇后 II | N-Queens II


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/9910438.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

    Given an integer n, return the number of distinct solutions to the n-queens puzzle.

    Example:

    Input: 4
    Output: 2
    Explanation: There are two distinct solutions to the 4-queens puzzle as shown below.
    [
     [".Q..",  // Solution 1
      "...Q",
      "Q...",
      "..Q."],
    
     ["..Q.",  // Solution 2
      "Q...",
      "...Q",
      ".Q.."]
    ]

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

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

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

    示例:

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

    8ms
     1 class Solution {
     2     func totalNQueens(_ n: Int) -> Int {
     3         if n == 0 {
     4             return 0
     5         }
     6         var answer = 0
     7         var limit = (1<<n) - 1
     8         dfs(h: 0, r: 0, l: 0, answer: &answer, limit: &limit)
     9         return answer
    10     }
    11     private func dfs(h: Int, r: Int, l: Int, answer: inout Int, limit: inout Int) {
    12         if h == limit {
    13             answer += 1
    14             return
    15         }
    16         var position = limit & (~(h|r|l))
    17         while position > 0 {
    18             let p = position & (-position)
    19             position -= p
    20             dfs(h: h+p, r: (r+p)<<1, l: (l+p)>>1, answer: &answer, limit: &limit)
    21         }
    22     }
    23 }

    20ms

     1 class Solution {
     2     var placeArr : [Int]!
     3     var totalN : Int = 0
     4     func canPlace(_ row:Int , _ col:Int) -> Bool{
     5 
     6         var colInRow : Int = 0
     7         var offset : Int = 0
     8         for idx in 0 ..< row {
     9             colInRow = placeArr[idx]
    10            
    11             if colInRow == col {
    12                 return false
    13             }
    14             offset = row - idx
    15             if colInRow == col - offset{
    16                 return false
    17             }
    18             if colInRow == col + offset{
    19                 return false
    20             }
    21         }
    22         return true
    23     }
    24     
    25     var count : Int = 0
    26     func place(_ row:Int) -> (){
    27         if row == totalN {
    28             count += 1
    29         }else{
    30             for col in 0..<totalN {
    31                 if canPlace(row,col) {
    32                     placeArr[row] = col
    33                     place(row + 1)
    34                 }
    35             }
    36         }
    37     }
    38     
    39     func totalNQueens(_ n: Int) -> Int {
    40         totalN = n
    41         placeArr = Array(repeating : 0 , count : totalN)
    42         
    43         place(0)
    44         return count
    45     }
    46 }

    28ms

     1 class Solution {
     2     func totalNQueens(_ n: Int) -> Int {
     3         var board = [[Bool]](repeating: [Bool](repeating: false, count: n), count: n)
     4         var result = 0
     5         backtrack(&board, 0, &result)
     6         return result
     7     }
     8     
     9     private func backtrack(_ board: inout [[Bool]], _ row: Int, _ result: inout Int) {
    10         if row == board.count {
    11             result += 1
    12         } else {
    13             for col in 0..<board.count where canPlaceQueen(board, row, col) {
    14                 board[row][col] = true
    15                 backtrack(&board, row + 1, &result)
    16                 board[row][col] = false
    17             }
    18         }
    19     }
    20     
    21     private func canPlaceQueen(_ board: [[Bool]], _ row: Int, _ col: Int) -> Bool {
    22         let n = board.count
    23         
    24         for i in 0..<row where board[i][col] {
    25             return false
    26         }
    27         
    28         var i = row - 1
    29         var j = col - 1
    30         while i >= 0 && j >= 0 {
    31             if board[i][j] {
    32                 return false
    33             }
    34             i -= 1
    35             j -= 1
    36         }
    37         
    38         i = row - 1
    39         j = col + 1
    40         while i >= 0 && j < n {
    41             if board[i][j] {
    42                 return false
    43             }
    44             i -= 1
    45             j += 1
    46         }
    47         
    48         return true
    49     }
    50 }

    32ms

     1 class Solution {
     2     var placeArr : [Int]!
     3     var totalN : Int = 0
     4     func canPlace(_ row:Int , _ col:Int) -> Bool{
     5 
     6         var colInRow : Int = 0
     7         var offset : Int = 0
     8         for idx in 0 ..< row {
     9             colInRow = placeArr[idx]
    10            
    11             if colInRow == col {
    12                 return false
    13             }
    14             offset = row - idx
    15             if colInRow == col - offset{
    16                 return false
    17             }
    18             if colInRow == col + offset{
    19                 return false
    20             }
    21         }
    22         return true
    23     }
    24     
    25     var count : Int = 0
    26     func place(_ row:Int) -> (){
    27         if row == totalN {
    28             count += 1
    29         }else{
    30             for col in 0..<totalN {
    31                 if canPlace(row,col) {
    32                     placeArr[row] = col
    33                     place(row + 1)
    34                 }
    35             }
    36         }
    37     }
    38     
    39     func totalNQueens(_ n: Int) -> Int {
    40         totalN = n
    41         placeArr = Array(repeating : 0 , count : totalN)
    42         
    43         place(0)
    44         return count
    45     }
    46 }

    44ms

     1 class Solution {
     2     
     3     func totalNQueens(_ n: Int) -> Int {
     4         var result = 0
     5         var cols = [Int]()
     6         cols.reserveCapacity(n)
     7         queensDFS(n, &cols, &result)
     8         return result
     9     }
    10     
    11     fileprivate func queensDFS(_ n: Int, _ cols: inout [Int], _ counter: inout Int) {
    12         if cols.count == n {
    13             counter += 1
    14             return 
    15         }
    16         
    17         for colIndex in 0..<n {
    18             guard isValid(cols, colIndex) else {
    19                 continue
    20             }
    21             cols.append(colIndex)
    22             queensDFS(n, &cols, &counter)
    23             cols.removeLast()
    24         }
    25     }
    26     
    27     fileprivate func isValid(_ cols: [Int], _ colIndex: Int) -> Bool {
    28         for rowIndex in 0..<cols.count {
    29             if colIndex == cols[rowIndex] {
    30                 return false
    31             }
    32             if abs(colIndex - cols[rowIndex]) == abs(cols.count - rowIndex) {
    33                 return false
    34             }
    35         }
    36         return true
    37     }
    38 }
  • 相关阅读:
    add to svn ignore disabled
    Zend 安装 OpenExplorer插件
    Win7系统怎么清理注册表残留?【系统天地】
    永久免费Win10企业版激活密钥大全【系统天地】
    Win7取消自动锁屏的方法步骤【系统天地】
    手把手教你怎么激活windows10专业版【系统天地】
    win8解除网速限制的操作方法【系统天地】
    教你win10系统显卡驱动安装失败的解决方法【系统天地】
    Win7移动硬盘在电脑上不显示怎么办【系统天地】
    Win10运行程序提示不受信任的解决方法【系统天地】
  • 原文地址:https://www.cnblogs.com/strengthen/p/9910438.html
Copyright © 2020-2023  润新知