N皇后-leetcode 51

  • 回溯法解决,或者说是递归
  • 出口是获得到的可行解长度和n一致,出口和正常逻辑是if else关系
  • 如果满足要求,则temp的长度增加,然后增加新的约束,将temp和约束,以及需要用到的数据传入函数递归调用
  • 调用完之后temp把新加入的pop出来,同时解除新增的约束
    def __init__(self):
        self.res = []
    def solveNQueens(self, n):
        """
        :type n: int
        :rtype: List[List[str]]
        """
        temp = []
        col = [0] * n
        pie = {}
        na = {}
        self.dfs(0, n, temp, col, pie, na)
        return self.res

    def dfs(self, i, n, temp, col, pie, na):

        if len(temp) == n:
            # 注意是[:]
            self.res.append(temp[:])
        else:
            for j in range(n):
                # 判断条件
                if col[j] != 1 and (i+j) not in pie.keys() and (i-j) not in na.keys():
                    # temp长度增加
                    temp.append([i,j])
                    # 增加新的约束
                    col[j] = 1
                    pie[i+j] = True
                    na[i-j] = True
                    # 递归调用
                    self.dfs(i+1, n, temp, col, pie, na)
                    # pop出temp中新增的元素
                    temp.pop()
                    # 解除新增的约束
                    col[j] = 0
                    pie.pop(i+j)
                    na.pop(i-j)

转载于:https://www.jianshu.com/p/cf25d9379fe5

猜你喜欢

转载自blog.csdn.net/weixin_34413065/article/details/91054508