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 @   是冰美式诶  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示