题目
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens’ placement, where ‘Q’ and ‘.’ both indicate a queen and an empty space respectively.
Example:
Input: 4
Output: [
[".Q…", // Solution 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // Solution 2
“Q…”,
“…Q”,
“.Q…”]
]
Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above.
回溯法
判断指定的行列是否能放皇后,如果能放就递归下一行的所有列,不能放继续遍历该行下一列。
python 代码
class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
self.res = []
board = [['.']*n for i in range(n)]
self.backtrack(board,0)
return self.res
def backtrack(self,board,row):
if len(board) == row:
self.res.append(["".join(i) for i in board])
return
n = len(board)
for col in range(n):
if not self.valid(board,row,col):
continue
board[row][col] = 'Q'
self.backtrack(board,row+1)
board[row][col] = '.'
def valid(self,board,row,col):
n = len(board)
for i in range(1, row + 1):
# 判断同一列上是否有Q
if board[row - i][col] == 'Q':
return False
# 判断逆对角线是否有Q
if col - i >= 0 and board[row - i][col - i] == 'Q':
return False
# 判断正对角线是否有Q
if col + i < n and board[row - i][col + i] == 'Q':
return False
return True