題目介紹:51. n皇后
先給出答案:
class solution(object):
def solvenqueens(self, n):
""":type n: int
:rtype: list[list[str]]
使用最基礎的回溯演算法,決策樹遍歷
"""import copy
if n == 0: return
res =
path = [['.' for _ in range(n)] for _ in range(n)] # 申請列表型別變數,因為python字串不能直接修改某個字元
direction = [[-1, -1, -1, 0, 0, 1, 1, 1],
[-1, 0 ,1, -1, 1, -1, 0, 1]] # 分別表示上下左右 左上 左下 右上 右下
# 判斷當前位置是否合法,此處可以優化,因為當前元素上方、左下角和右上角的元素不需要判斷
def can(i, j):
for biger in range(1, n+1): # 一層一層向8個方向擴充套件,像泛起的水花
for k in range(8):
nexti = i + direction[0][k]*biger
nextj = j + direction[1][k]*biger
if nexti >= 0 and nexti < n and nextj >= 0 and nextj < n:
if path[nexti][nextj] == 'q':
return false
return true
# 判斷第i層可以放置的所有位置(當前行的所有位置),i從0開始
def back_track(path, i):
# 結束條件
if i == n:
return
for j in range(n): # 遍歷當前層的所有選擇
if can(i, j) == false: # 判斷第i層的j位置是否合法,進行剪枝操作
continue
path[i][j] = 'q' # 做選擇
back_track(path, i+1) # 回溯
path[i][j] = '.' # 撤銷選擇
back_track(path, 0)
str_res = [[''.join(line) for line in m] for m in res] # 轉換格式
return str_res
# s = solution()
# print(s.solvenqueens(4))
# 小實驗用於測試
# path = [['.', '.' , '.'], ['.', '.' , '.']]
# a = path[:][:]
# path[1][0] = 'o'
# print(a)
# a = '....'
# a[1] = 'o'
# print(a)
result =
def backtrack(路徑, 選擇列表):
if 滿⾜結束條件:
result.add(路徑)
return
for 選擇 in 選擇列表:
做選擇 # 對應樹的前序遍歷
backtrack(路徑, 選擇列表)
撤銷選擇 # 對應樹的後續遍歷
ps:前序遍歷的**在進⼊某⼀個樹的節點之前的那個時間點執⾏,後序遍歷**在離開某個節點之後的那個時間點執⾏。我們要在遞迴之前做出選擇,在遞迴之後撤銷剛才的選擇。 回溯演算法之 N皇后問題
n皇后 include include define max 15 int n n queen int cur cur row int a max the ith row s queen put in the a i th column int tot 0 total nums cur 為當前遍歷到...
回溯演算法之n皇后問題
n皇后問題 輸出8皇后問題所有結果。輸入 n 棋盤的行列 輸出 每個結果第一行是no n 的形式,n表示輸出的是第幾個結果 下面8行,每行8個字元,a 表示皇后,表示空格。不同的結果中,先輸出第乙個皇后位置靠前的結果 第乙個皇后位置相同,先輸出第二個皇后位置靠前的結果 依次類推。輸入樣例 8 輸出樣...
N皇后 回溯演算法
res 用於儲存最終結果 defdfs n,x,arr,cols,diag1,diag2 if x n else 對於每一行x,迴圈搜尋不同的列y值 for y in range n if check x,y 合法 更新合法性判斷引數 更新arr,cols,diag1,diag2等引數 dfs n,...