题目:给定一个整数 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)