n皇后
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
力扣上的第51题
这道题困扰了我好久,一直都不会(流泪),看来很多资料,现在终于会做了
话不多说
N皇后是回溯的经典问题,想要解决这个问题,我们首先想要知道回溯是什么
什么是回溯算法
回溯算法,一种通过探索所有可能的候选解来找出所有的解的算法。它采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:
找到一个可能存在的正确的答案; 在尝试了所有可能的分步方法后宣告该问题没有答案。
解题思路
我们用一个for循环来遍历列,用回溯来遍历行。
列如,我们想要在第一行第一列放皇后,那么我们需要先判断此位置是不是可以放皇后,所以需要写一个判断当前位置能否放置皇后的函数,当第一行第一列可以放置时,通过回溯到达下一行,接着判断,依次执行,直到运行到第n行时,将结果放入到结果集中。
代码
def is_vaild(row,col,board):
for i in range(row):
if board[i][col]=='Q':
return False
for j in range(col):
if board[row][j]=='Q':
return False
i=row-1
j=col-1
while i>=0 and j>=0:
if board[i][j]=='Q':
return False
i-=1
j-=1
i=row-1
j=col+1
while i>=0 and j<n:
if board[i][j]=='Q':
return False
i-=1
j+=1
return True
def backtrack(row,board):
global result
if row==n:
res=[]
for i in board:
res.append("".join(i))
result.append(res)
return
for col in range(n):
if is_vaild(row,col,board):
board[row][col]='Q'
backtrack(row+1,board)
board[row][col]='.'
if __name__=='__main__':
n=4
board=[['.' for i in range(n)]for i in range(n)]
result=[]
backtrack(0,board)
print(result)
执行结果