八皇后問題介紹
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於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 如果衝突...