回溯法 n皇后 python 解法二

2021-08-11 10:38:42 字數 2108 閱讀 9178

普通的用二維陣列解決

這兒採用一維陣列,即行數作為index,而列數代表array[index]

輸出所有的解

global n  # 皇后個數

# global x # 當前解 list型別不需要宣告為全域性變數!

global sum # 當前已找到的可行方案數

n = 4

# x = [0 for i in range(n)]

sum = 0

defprint_solution

(x):

for i in range(len(x)):

print(x[i], end="")

print()

defis_safe

(k):

for i in range(k):

if x[i] == x[k]:

return

false

if (x[i] - x[k]) == (i - k):

return

false

if (x[i] - x[k]) == (k - i):

return

false

return

true

defbacktrack

(t):

if t >= n:

global sum # 若希望在區域性函式中修改全域性變數,則需要先宣告,否則會把sum作為區域性變數處理

sum += 1

print_solution(x)

else:

for i in range(n):

x[t] = i

if is_safe(t):

backtrack(t + 1)

if __name__ == "__main__":

x = [0

for i in range(n)]

backtrack(0)

print("sum =" + str(sum))

若只想輸出指定個數的解就退出:

global n  # 皇后個數

# global x # 當前解 list型別不需要宣告為全域性變數!

global sum # 當前已找到的可行方案數

n = 4

# x = [0 for i in range(n)]

sum = 0

defprint_solution

(x):

for i in range(len(x)):

print(x[i], end="")

print()

defis_safe

(k):

for i in range(k):

if x[i] == x[k]:

return

false

if (x[i] - x[k]) == (i - k):

return

false

if (x[i] - x[k]) == (k - i):

return

false

return

true

defbacktrack

(t):

# 但其實這樣寫不怎麼好,因為破壞了回溯法的結構

# 更好的寫法是,把判斷放到剪紙函式中,這兒即is_safe()中去判斷

global sum

if sum >= 1: # 達到期望的借個數就退出

return

if t >= n:

# global sum # 若希望在區域性函式中修改全域性變數,則需要先宣告,否則會把sum作為區域性變數處理

sum += 1

print_solution(x)

else:

for i in range(n):

x[t] = i

if is_safe(t):

backtrack(t + 1)

if __name__ == "__main__":

x = [0

for i in range(n)]

backtrack(0)

print("sum =" + str(sum))

N 皇后問題 回溯法

n 皇后問題 在 n n 的棋盤上放置彼此不受攻擊的 n 個皇后,任意兩個皇后不同行 不同列 不同斜線。思路 1.因為皇后不能同行,所以,在每一行放置乙個皇后就行 2.當在一行放置皇后的時候 1 順序檢查這一行每乙個位置是否和上面所有的皇后,只要有乙個同列或者在斜線上就不能放置 若找到乙個滿足的,放...

回溯法 n皇后問題

問題描述 在nxn的棋盤上,放置彼此不受攻擊的n個皇后。規則 皇后可以攻擊與之在同一行,同一列,同一斜線上的棋子。以行為主導 不用再判斷是否同行了 演算法設計 1 定義問題的解空間 問題解的形式為n元組 分量xi表示第i個皇后放置在第i行,第xi列。2 解空間的組織結構 m叉樹 3 搜尋解空間 約束...

回溯法 N皇后問題

n 皇后問題研究的是如何將n 個皇后放置在 n n 的棋盤上,並且使皇后彼此之間不能相互攻擊。不能相互攻擊就是n個皇后兩兩不能同行同列同對角線。示例 輸入 4 輸出 q 解法 1 q q q.q.解法 2 q q q 解釋 4 皇后問題存在兩個不同的解法。可以利用 回溯法子集樹 模板進行求解,每個節...