题目:
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
示例:
输入: 4
输出: [
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。
提示:
皇后,是国际象棋中的棋子,意味着国王的妻子。皇后只做一件事,那就是“吃子”。当她遇见可以吃的棋子时,就迅速冲上去吃掉棋子。当然,她横、竖、斜都可走一到七步,可进可退。(引用自 百度百科 - 皇后 )
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
个人思路:
回溯
官方答案推荐:
就是回溯
python代码:
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
result = []
chessboard = [['.']*n for _ in range(n)]
def backtrack(curRow):
if curRow == n:
#转为字符串
result.append([''.join(i) for i in chessboard])
return
#每行一个,行单调增加,对列进行遍历尝试
for curCol in range(n):
#判断是否有交叉
if not isValid(curRow,curCol):
continue
chessboard[curRow][curCol] = 'Q'
backtrack(curRow+1)
chessboard[curRow][curCol] = '.'
def isValid(row,col):
#判断列,注意不用判断行,row的值单调增加
for i in range(row):
if chessboard[i][col] == 'Q':
return False
#判断右上角
Rrow,Rcol = row,col
while Rrow>=0 and Rcol<n:
if chessboard[Rrow][Rcol] == 'Q':
return False
Rrow -= 1
Rcol += 1
#判断左上角
while row>=0 and col>=0:
if chessboard[row][col] == 'Q':
return False
row -= 1
col -= 1
return True
backtrack(0)
return result
反思:
一开始傻了,想着最后在result里面转为字符串,试了半天没试出来。。。python还是不够熟