n皇后问题(回溯算法)

问题定义:国际象棋中,皇后可以直线进攻也可以斜线进攻,问在NxN的国际象棋棋盘上摆N个皇后,问摆使得N个皇后之间无法相互进攻有多少种摆法?

通过回溯法解决。

def isValid(matrix,row,col):
    n = len(matrix)
    for i in range(row):
        for j in range(n):
            if matrix[i][j]=='Q' and (j==col or abs(row-i)==abs(col-j)):
                return False
    return True
class Solution:
    def solveNQueens(self, n: int):
        matrix = [['.' for _ in range(n)] for __ in range(n)]
        matrixs = []
        def dfs(x):
            if x==n:
                tmp = matrix.copy()
                for i in range(n):
                    tmp[i] = ''.join(tmp[i])
                matrixs.append(tmp)
                return
            for col in range(n):
                if isValid(matrix,x,col):
                    matrix[x][col]='Q'
                    dfs(x+1)
                    matrix[x][col]='.'
        dfs(0)
        return matrixs

 关键在于判断当前皇后的位置和已经安排的皇后的位置是否冲突,深度优先搜索 dfs(x)中x代表皇后所在的行,由于我们是一行一行依次摆放皇后的,所以不存在行冲突。只需要判断列冲突和斜线的冲突。

判断条件  matrix[i][j]==1 and ( j==col and abs(row-i)==abs(col-j))   

解释一下斜线的判断:  前面放置的皇后的位置 i,j   与  此刻皇后的位置 row ,col   行的间距和列的间距正好相等,说明他们在一条斜线上。

原文地址:https://www.cnblogs.com/bianque/p/13544408.html