52N皇后II

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

来源:https://leetcode-cn.com/problems/n-queens-ii/

法一: 自己的代码  时间超过百分之90

思路: 奇数和偶数分别计算,偶数直接利用对称性,奇数要特别计算第一行中间的列

class Solution:
    def totalNQueens(self, n: int) -> int:
        results = [0]
        def backtrack(half_col,row=-1,col=0, ):
            # 回溯终止条件,如果到最后一行了,说明找到一个解了,存储
            if row == n-1:
                # solution = []
                # for _, col in sorted(queens):
                #     solution.append('.' * col + 'Q' + '.' * (n - col - 1))
                # results.append(solution)
                # print(results)
                results[0] = results[0] + 1
                return
            row += 1
            if (row == 0):
                # 第一行由于对称,所以n为奇数的时候,只遍历一半的列
                for col in half_col:
                    if cols[col] + p[col+row] + q[col-row] == 0:
                        queens.add((row,col))
                        cols[col] = 1
                        p[col+row] = 1
                        q[col-row] = 1
                        backtrack(half_col,row,col)
                        queens.remove((row,col))
                        cols[col] = 0
                        p[col + row] = 0
                        q[col - row] = 0
            else:
                for col in range(n):
                    if cols[col] + p[col+row] + q[col-row] == 0:
                        queens.add((row,col))
                        cols[col] = 1
                        p[col+row] = 1
                        q[col-row] = 1
                        # 这里特别要注意参数的传递,位置参数必须传递
                        # backtrack(row,col) 这是原先错误写法
                        backtrack(half_col,row,col)
                        queens.remove((row,col))
                        cols[col] = 0
                        p[col + row] = 0
                        q[col - row] = 0
        cols = [0] * n
        p = [0] * (2*n - 1)
        q = [0] * (2*n - 1)
        queens = set()
        if n % 2 == 0:
            backtrack(half_col=range(int(n/2)))
            return results[0] * 2
        # 当n为奇数的时候,遍历完一半的列后,还要遍历中间的列
        else:
            backtrack(half_col=range(int(n/2)))
            results[0] = results[0] * 2
            # 注意这里n为奇数时,中间的数是int(n/2)
            backtrack(half_col=[int(n/2)])
            return results[0]
if __name__ == '__main__':
    duixiang = Solution()
    ww = duixiang.totalNQueens(1)
    print('结果是:', ww)
View Code
原文地址:https://www.cnblogs.com/xxswkl/p/11969867.html