N皇后之回溯演算法小結

2021-10-03 08:59:06 字數 1840 閱讀 5900

題目介紹: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,...