回溯法解決N皇后的問題

2021-09-10 01:32:32 字數 1837 閱讀 8827

# 使用回溯法解決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 順序檢查這一行每乙個位置是否和上面所有的皇后,只要有乙個同列或者在斜線上就不能放置 若找到乙個滿足的,放...