NO51.N皇后 NO52.N皇后问题 Ⅱ

整体思路:解决三个问题行列以及斜线
简言之每行只有一个且不重复位置的条件下满足无斜线
利用一个queen数组来进行移动,diagnose_对角线分别满足行列之和和之差相等
如果满足则前进不满足就回溯

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        def getQueen(queen_row:int): #queen_row为每一行的皇后,每行仅有一个
            if queen_row==n:
                ans = list()
                for i in range(n):
                    row[queen[i]]='Q'
                    ans.append(''.join(row))
                    row[queen[i]]='.'#更改为下次进行遍历
                res.append(ans)
            for i in range(n): #对横纵以及斜线冲突的剪枝
                if i in col or queen_row -i in diagnose_demo1 or queen_row+i in diagnose_demo2:
                    continue #如果遍历到i点时在列和对角线时,先不管因为才第一次便利
                diagnose_demo1.add(queen_row-i)
                diagnose_demo2.add(queen_row+i) #维护和遍历
                col.add(i)
                queen[queen_row]=i
                getQueen(queen_row+1)#递归下一条
                diagnose_demo1.remove(queen_row-i)
                diagnose_demo2.remove(queen_row+i) #回溯去除状态的更改
                col.remove(i)
                queen[queen_row]=-1
        if n==1: #特殊情况的判断
            return [['Q']]
        res = [] #定义空列表
        diagnose_demo1 = set() #设置对角线为集合,去除重复性
        diagnose_demo2 = set()
        col = set() #每一列的判断
        row = ['.']*n #先把每一行定义为'.'
        queen = [-1]*n #设置皇后数组
        getQueen(0) #初始化
        return res #返回结果

             

 

#这个在Ⅰ的基础上,直接获取方案的数量
class Solution:
    def totalNQueens(self, n: int) -> int:
        if n<=1:
            return 1
        def getQueen(queen_row:int): #queen_row为每一行的皇后,每行仅有一个
            if queen_row==n:
                ans = list()
                for i in range(n):
                    row[queen[i]]='Q'
                    ans.append(''.join(row))
                    row[queen[i]]='.'#更改为下次进行遍历
                res.append(ans)
            for i in range(n): #对横纵以及斜线冲突的剪枝
                if i in col or queen_row -i in diagnose_demo1 or queen_row+i in diagnose_demo2:
                    continue #如果遍历到i点时在列和对角线时,先不管因为才第一次便利
                diagnose_demo1.add(queen_row-i)
                diagnose_demo2.add(queen_row+i) #维护和遍历
                col.add(i)
                queen[queen_row]=i
                getQueen(queen_row+1)#递归下一条
                diagnose_demo1.remove(queen_row-i)
                diagnose_demo2.remove(queen_row+i) #回溯去除状态的更改
                col.remove(i)
                queen[queen_row]=-1
        if n==1: #特殊情况的判断
            return [['Q']]
        res = [] #定义空列表
        diagnose_demo1 = set() #设置对角线为集合,去除重复性
        diagnose_demo2 = set()
        col = set() #每一列的判断
        row = ['.']*n #先把每一行定义为'.'
        queen = [-1]*n #设置皇后数组
        getQueen(0) #初始化
        return len(res) #返回结果
class Solution:
    def totalNQueens(self, n: int) -> int:
        cols,sums,diffs = set(),set(),set()
        res = [0]
        #放置第row行
        def backtrack(row):
            if row==n:
                res[0]+=1 #当 row==n说明有一条路跑通
                return
            for col in range(n):
                if (col not in cols) and (col + row not in sums) and (col-row not in diffs):
                    cols.add(col)
                    sums.add(col+row)
                    diffs.add(col-row)
                    
                    backtrack(row+1)

                    cols.remove(col)
                    sums.remove(col+row)
                    diffs.remove(col-row)
        backtrack(0)
        return res[0]
posted @ 2022-07-25 22:46  是冰美式诶  阅读(43)  评论(0)    收藏  举报