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]