leetcode 51 n皇后
題目描述:
n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並且使皇后彼此之間不能相互攻擊。
題目分析:
- 首先看到題目需要我們找到皇后所有的可能擺放位置,那麼肯定需要我們遍歷所有可能的空間,同時在嘗試的擺放方案不合理時直接退回上一步。
- 直覺的方法就是遞歸,同時傳遞一個list來記錄之前嘗試的皇后的位置,每一次迭代時首先根據傳遞進來的list計算不會被之前的皇后攻擊的位置,然後在list append本輪的皇后位置後在遞歸,返回時記得把本輪append上去的皇后的位置pop掉。
Python代碼
class Solution(object):
def solveNQueens(self, n):
"""
:type n: int
:rtype: List[List[str]]
"""
if not n:
return [[]]
if n == 1:
return [['Q']]
if n < 4:
return []
res = []
def recur_find(q_list):
if len(q_list) == n:
temp = []
for i in q_list:
temp_res = ['.' for j in xrange(n)]
temp_res[i] = 'Q'
temp.append(''.join(temp_res))
res.append(temp)
return
danger_list = set()
for level, pos in enumerate(q_list):
pos_l = pos - (len(q_list)) + level if pos - (len(q_list)) + level >= 0 else None
pos_r = pos + (len(q_list)) - level if pos + (len(q_list)) - level <= n - 1 else None
if pos_l is not None:
danger_list.add(pos_l)
if pos_r is not None:
danger_list.add(pos_r)
danger_list.add(pos)
for i in xrange(n):
if i in danger_list:
continue
q_list.append(i)
recur_find(q_list)
q_list.pop()
recur_find([])
return res