資料結構與演算法 遞迴 八皇后

2021-10-22 23:42:05 字數 1781 閱讀 6868

八皇后問題介紹

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

由於西洋棋是乙個8*8的棋盤,而且棋盤中總共需要放置8個皇后。那麼肯定在每一行都會有且僅有乙個皇后,那麼可以直接使用乙個一維陣列,使用它的下標代表行數,陣列的值代表每一行對應的列數。

具體步驟如下:

1)第乙個皇后放在第一行第一列

2)第二個皇后放在第二行第第一列、然後判斷是否ok;如果不ok,那麼就橫向右移,直到找到合適的位置

3)繼續第三個皇后,還是重複第二行的操作,並且要同時判斷和第一行和第二行的是否衝突,直到找到合適位置

4)當得到乙個正確解時,在棧回退到上乙個棧時,就會開始回溯,即將第乙個皇后,放到第一行的所有解,全部得到

5)然後將第乙個皇后放到第二列,後面迴圈執行1,2,3,4的步驟

import math

class

queue

(object):

def__init__

(self)

: self.cnt =

0#統計八個皇后的滿足要求的擺放方式的個數

self.maxn =

8#陣列的最大長度

self.array =[0

for i in

range(8

)]#陣列下標代表行,每個下標的值為列

''' 列印皇后位置陣列

'''defprint

(self)

:for i in

range

(len

(self.array)):

print

("%d "

%self.array[i]

,end='')

print()

''' 判斷當前皇后位置和前幾個皇后的位置是否衝突

'''defjudge

(self,n)

:for i in

range

(n):

if self.array[i]

==self.array[n]

orabs

(n-i)

==abs

(self.array[n]

-self.array[i]):

return

false

return

true

''' 回溯遞迴

'''defcheck

(self,n)

:if n==self.maxn:

self.cnt+=

1 self.print(

)return

for i in

range

(self.maxn)

: self.array[n]

=i if self.judge(n)

: self.check(n+1)

q = queue(

)q.check(0)

num = q.cnt

print

('總共:%d'

%num)

資料結構與演算法 遞迴回溯 八皇后問題

package recurtion 八皇后問題 public class queue8 system.out.println param n 第幾個皇后 return 判斷放置的皇后是不是在同一列或者對角線,因為是按順序放置,因此不可能在同一行 public boolean judge int n ...

資料結構 八皇后演算法

八皇后的基本要求是這樣的 在乙個8 8的矩陣上面放置8個物體,乙個矩陣點只允許放置乙個物體,任意兩個點不能在一行上,也不能在一列上,不能在一條左斜線上,當然也不能在一條右斜線上。參考網上資料改寫 如下 include include include includeusing namespace st...

資料結構和演算法遞迴之八皇后問題

package recursion public class queen8 寫乙個放置第n個皇后的方法 注意 check 每一次遞迴時進入到check中都有for int i 0 i private void check int n 依次放入皇后,並判斷是否衝突 for int i 0 i 如果衝突...