leetcode51—N皇后(全网最易懂)

1、一行作为一层递归,本层for循环代表着本行的皇后的每个可能位置

2、用一个二维的visit数组存储皇后的攻击范围

3、放入一个皇后时,更新visit数组,回溯时,也更新visi数组

4、更新操作为“计数”,当计数为0时,该位置无攻击,当计数>0时,该位置有皇后攻击

5、计数不能为负

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        res = []
        path = []
        cantvisit_matrix = [[0] * n for _ in range(n)]

        def set_cant(line, column):
            for i in range(n):
                cantvisit_matrix[line][i] += 1
                cantvisit_matrix[i][column] += 1
            for i in range(n):
                for j in range(n):
                    if i - j == line - column:
                        cantvisit_matrix[i][j] += 1
                    if i + j == line + column:
                        cantvisit_matrix[i][j] += 1

        def resvoca_cant(line, column):
            for i in range(n):
                if cantvisit_matrix[line][i] > 0:
                    cantvisit_matrix[line][i] -= 1
                if cantvisit_matrix[i][column] > 0:
                    cantvisit_matrix[i][column] -= 1
            for i in range(n):
                for j in range(n):
                    if i - j == line - column:
                        if cantvisit_matrix[i][j] > 0:
                            cantvisit_matrix[i][j] -= 1
                    if i + j == line + column:
                        if cantvisit_matrix[i][j] > 0:
                            cantvisit_matrix[i][j] -= 1

        def backtracking(line):
            if line == n:
                res.append(path[:])
                return

            for j in range(n):
                if cantvisit_matrix[line][j] != 0:
                    continue
                s = ['.'] * n
                s[j] = 'Q'
                path.append(''.join(s))
                set_cant(line, j)     #设置cant
                backtracking(line+1)
                resvoca_cant(line, j)    #回溯cant
                path.pop()

        backtracking(0)
        return res

你可能感兴趣的:(回溯算法,算法)