zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    汉语-词语:冷静
    汉语-词语:沉着
    汉语-词语-稳重:百科
    汉语-词语:沉稳
    汉语-词语-丘壑:百科
    Struts中的常量
    算法整理(四):浅析高速排序的优化问题
    互联网+时代,是更加开放还是封闭
    UI复习练习_优酷布局
    fread与read的差别(文件io补充)
  • 原文地址:https://www.cnblogs.com/xxswkl/p/11969867.html
Copyright © 2011-2022 走看看