回溯法 《8皇后問題》 python實現

2021-08-22 14:43:17 字數 1873 閱讀 1800

該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

思路:一行一行的放置皇后,判斷皇后的位置是否符合條件,當放置到最後一行時,則所有皇后的位置放置完畢,儲存棋盤活棋盤數加一。

#coding:utf-8

import copy

c = 0

def notdanger(b, row, x, y): #判斷皇后的放置位置(x,y)是否滿足每一行、每一列,斜線都只有(x,y)乙個皇后

t1 = true

t2 = true

t3 = true

t4 = true

t5 = true

for iii in range(0, row):

if b[iii][y] == 1:

t1 = false

break

iii = x

jjj = y

while iii >= 0 and jjj >= 0:

if b[iii][jjj] == 1:

t2 = false

break

iii = iii - 1

jjj = jjj - 1

iii = x

jjj = y

while iii >= 0 and jjj < row:

if b[iii][jjj] == 1:

t3 = false

break

iii = iii - 1

jjj = jjj + 1

iii = x

jjj = y

while iii < row and jjj >= 0:

if b[iii][jjj] == 1:

t4 = false

break

iii = iii + 1

jjj = jjj - 1

iii = x

jjj = y

while iii < row and jjj < row:

if b[iii][jjj] == 1:

t5 = false

break

iii = iii + 1

jjj = jjj + 1

return t1 and t2 and t3 and t4 and t5

def eightqueen(a, row, i):

b = copy.deepcopy(a)

if i == 8: #一行一行的放置皇后,當放置到第8行時,結果滿足條件,棋盤數+1

global c

c = c + 1

print c

else:

for ii in range(0, 8):

if notdanger(b, row, i, ii): #判斷棋盤的(i, ii)位置是否符合要求

for jj in range(0, row):

b[i][jj] = 0

b[i][ii] = 1 #符合要求,將皇后放置在該位置

eightqueen(b, row, i + 1)

if __name__ == '__main__':

a =

for i in range(0, 8):

b =

for j in range(0, 8):

eightqueen(a, 8, 0) #a表示初始棋盤,8表示棋盤的行列數,0表示棋盤的第幾行

#print c

8皇后問題 回溯法

為了簡化,先對4皇后問題進行討論,對與4皇后問題,先定義乙個4x4的棋盤 矩陣 按照下面規則將4個棋子 皇后 放到棋盤上。規定 1 任何兩個棋子不同行 2 任何兩個棋子不同列 3 任何兩個棋子不在用一對角線上 先引入一副圖來說明 該圖為嚴版教材上的 對與此問題,剛開始的時候棋盤為空,回溯法的思想是 ...

8皇后回溯法

思路 逐行放置,逐列搜尋。從當前行的第一列開始搜尋,判斷該位置是否合法。合法則遞迴判斷下一行,不合法則搜尋下一列,直到最後一列也不符合,或者在最後一行放下棋子就返回上一次遞迴,一直到第一行遍歷完畢。include include include define maxsize 8 char a max...

回溯法求解8皇后問題

問題描述 在乙個8 8西洋棋盤上,有8個皇后,每個皇后佔一格 要求皇后間不會出現相互攻擊的現象,即不能有兩個皇后處在同一行 同一列或同一對角線上 問共有多少種不同的擺放方法?本解法採用回溯遞迴法,容易理解,首先在棋盤上擺第乙個皇后,然後擺第二個,每擺乙個皇后則判斷位置是否合法。如果合法,則擺下乙個皇...