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]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)