Leetcode 52. N-Queens II

作者: Zentopia | 来源:发表于2017-11-23 14:14 被阅读6次

    回溯法,非递归求 N 皇后问题解个数,Python 3 实现:

    源代码已上传 Github,持续更新。

    """
    52. N-Queens II
    
    Follow up for N-Queens problem.
    Now, instead outputting board configurations, return the total number of distinct solutions.
    
    """
    
    
    class Solution:
    
        # 判断同一列和同一斜线上是否存在 Queue
        def is_valid(self, row, column, queen_record):
            c_left = column
            c_right = column
            for r in range(row, -1, -1):
                if queen_record[r] == column or queen_record[r] == c_left or queen_record[r] == c_right:
                    return False
                c_left -= 1
                c_right += 1
            return True
    
        def totalNQueens(self, n):
            """
            :type n: int
            :rtype: int
            """
            chess_board = [['.' for x in range(n)] for y in range(n)]
    
            # 初始化为 - 1,表示当前行还未放 Queue
            queen_record = [-1 for x in range(n)]
            solutions = []
    
            row = 0
            column = 0
            has_solution = True
            while has_solution:
    
                while row in range(n):
    
                    while column < n or queen_record[row] == -1:
    
                        if column < n and self.is_valid(row, column, queen_record):
                            chess_board[row][column] = 'Q'
                            queen_record[row] = column
                            break
                        else:
                            column += 1
    
                            if column >= n:
                                # 当前行无法放置 Queue 开始回溯
                                row = row - 1
                                if row < 0:
                                    has_solution = False
                                    break
    
                                chess_board[row][queen_record[row]] = '.'
                                column = queen_record[row] + 1
                                queen_record[row] = -1
    
                    if has_solution:
                        column = 0
                        row += 1
    
                if has_solution:
                    solutions.append(chess_board)
    
                    # 回溯
                    row -= 1
                    chess_board[row][queen_record[row]] = '.'
                    column = queen_record[row] + 1
                    queen_record[row] = -1
    
            return len(solutions)
    
    
    if __name__ == '__main__':
        solution = Solution()
        result = solution.totalNQueens(4)
        print(result)
    

    源代码已上传至 Github,持续更新中。

    相关文章

      网友评论

        本文标题:Leetcode 52. N-Queens II

        本文链接:https://www.haomeiwen.com/subject/nqszvxtx.html