# 使用回溯法解決n皇后的問題
def mk_lst(size): # 生成棋盤
return [[0 for i in range(size)] for j in range(size)]
def is_legal_posi(loca, size): # 判斷是否合法座標
x, y = loca[0], loca[1]
size -= 1
if 0 <= x <= size and 0 <= y <= size:
return true
else:
return false
def place(loca, size, num, lst): # 放置皇后棋子,num設定1 表示放置皇后,0表示拿走皇后
lst = lst[:]
x, y = loca[0], loca[1]
r = range(-size, size + 1)
row = [(_, y) for _ in r if is_legal_posi((_, y), size)]
col = [(x, _) for _ in r if is_legal_posi((x, _), size)]
up = [(x + _, y + _) for _ in r if is_legal_posi((x + _, y + _), size)]
down = [(x - _, y + _) for _ in r if is_legal_posi((x - _, y + _), size)]
for i in row, col, up, down:
for j in i:
lst[j[0]][j[1]] = num
def add_next(loca, size, lst): # 如果到最後一行, 或者下一行沒有位置 就返回false
x, y = loca[0], loca[1]
if x + 1 > size - 1: # 說明到底了
return false
l = [(x + 1, _) for _ in range(size) if lst[x + 1][_] != 1]
if not l:
return false
else:
return l
def solution(size):
path, count_l, outcome, final = , , ,
for loca in [(0, i) for i in range(size)]: # 初始位置
while path:
lst = mk_lst(size)
count_l[-1] -= 1
for loca in outcome:
place(loca, size, 1, lst)
l = add_next(loca, size, lst)
if l:
for i in l:
else:
if len(outcome) == size:
if outcome:
outcome.pop()
t = 0
while count_l:
if count_l[-1] == 0:
count_l.pop()
t += 1
else:
break
if t:
for i in range(t):
if outcome:
outcome.pop()
print(len(final))
return final
solution(8)
回溯法解決n皇后問題
回溯法的基本行為是搜尋,搜尋過程使用剪枝函式來為了避免無效的搜尋。剪枝函式包括兩類 1.使用約束函式,剪去不滿足約束條件的路徑 2.使用限界函式,剪去不能得到最優解的路徑。1 針對所給問題,確定問題的解空間 首先應明確定義問題的解空間,問題的解空間應至少包含問題的乙個 最優 解。2 確定結點的擴充套...
回溯法解決N皇后問題
在棋盤上放置8個皇后,使得它們互不攻擊,此時每個皇后的攻擊範圍為同行同列和同對角線,要求找出所有解。遞迴函式將不再遞迴呼叫它自身,而是返回上一層呼叫,這種現象稱為回溯 backtracking 當把問題分成若干步驟並遞迴求解時,如果當前步驟沒有合法選擇,則函式將返回上一級遞迴呼叫,這種現象稱為回溯。...
N 皇后問題 回溯法
n 皇后問題 在 n n 的棋盤上放置彼此不受攻擊的 n 個皇后,任意兩個皇后不同行 不同列 不同斜線。思路 1.因為皇后不能同行,所以,在每一行放置乙個皇后就行 2.當在一行放置皇后的時候 1 順序檢查這一行每乙個位置是否和上面所有的皇后,只要有乙個同列或者在斜線上就不能放置 若找到乙個滿足的,放...