• 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
  • 相关阅读:
    关于js中"window.location.href"、"location.href"、"parent.location.href"、"top.location.href"的用法
    对于json数据的应用01
    关于session应用(1)session过期时间设置
    关于session应用(2)JAVA中怎么使用session
    Jquery常用技巧(3)
    0101对称二叉树 Marathon
    0112路径之和 & 0113所有路径之和 Marathon
    0106105从中序与后序遍历序列中构造二叉树 Marathon
    0110平衡二叉树 Marathon
    0513找树左下角的值 Marathon
  • 原文地址:https://www.cnblogs.com/xxswkl/p/11969867.html
Copyright © 2020-2023  润新知