演算法之八皇后問題的解決方法

2022-08-02 09:12:13 字數 1974 閱讀 2362

問題描述: 在西洋棋棋盤上,棋盤是8*8的,皇后可以吃掉其同一行列以及斜線方向的棋子,在這張棋盤上可以有多少種8個皇后的擺放方法,能夠讓各個皇后都不能吃掉其他皇后。

求解思路:回溯與遞迴演算法 python

1.確定並除錯檢測函式,檢測函式的作用是檢查當前加入的新皇后是否符合要求

1

defcheck(quene_list ,listnum):

2for i in

range(listnum):

3if abs(quene_list[listnum]-quene_list[i]) == listnum - i or quene_list[listnum] ==quene_list[i]:4#

當條件成立時說明新加入的皇后會被攻擊到

5return06

return 1

2.遞迴回溯   判斷終止條件是當計算到最後一列時,首先確定第n列加入棋盤不會產生衝突,在第n+1列加入皇后,若不衝突則遞迴計算下乙個。在思想上有點像數學歸納法。

1

defquene(quene_list, listnum, num):

2global

solve_num

3if listnum ==num:

4 solve_num = solve_num + 1

5print

(quene_list)

6return 1

7else:8

for i in

range(num):

9 quene_list[listnum] =i

10if

check(quene_list, listnum):

11 quene(quene_list,listnum+1,num)

3.用python實現八皇后問題的完整**

1

#-*- coding: utf-8 -*-2#

八皇后問題的求解,遞迴回溯問題34

import

math

56 solve_num =078

defcheck(quene_list ,listnum):

9for i in

range(listnum):

10if abs(quene_list[listnum]-quene_list[i]) == listnum - i or quene_list[listnum] ==quene_list[i]:11#

當條件成立時說明新加入的皇后會被攻擊到

12return013

return 1

1415

defquene(quene_list, listnum, num):

16global

solve_num

17if listnum ==num:

18 solve_num = solve_num + 1

19print

(quene_list)

20return 1

21else:22

for i in

range(num):

23 quene_list[listnum] =i

24if

check(quene_list, listnum):

25 quene(quene_list,listnum+1,num)

2627

if__name__ == "

__main__":

28 quene_list =[0, 0, 0, 0, 0, 0, 0, 0,0]

29 num = 9

30 quene(quene_list,0, 8)

31print(solve_num)

view code

python八皇后問題的解決方法

題目 給定乙個 n n 正方形棋盤,在上面放置 n個棋子,又叫皇后,使每兩個棋子都不在同一條橫線上 豎線上 斜線上。一般我們都討論8皇后,但是只要n 4,都會存在解的。分析 方法1 根據定義來處理,即每往棋盤中放置皇后的時候,都要判斷哪些位置可以放新加入的皇后,而哪些地方如果放置皇后的話,會造成衝突...

八皇后問題的兩種解決方法

最近看到遞迴,原本利用回溯思想解決的經典八皇后問題,其實也是可以用遞迴解決的 八皇后的遞迴解決思路 從第一行開始,依次判斷0 8列的哪一列可以放置queen,這樣就確定了該行的queen的位置,然後行數遞增,繼而遞迴實現下一行的判斷,依次類推直到行數增加到8 行數從0開始的 此時為遞迴 歸的條件,即...

遞迴演算法解決八皇后問題

在 8 8 格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有 76 種方案。1854 年在柏林的象棋雜誌上不同的作者發表了 40 種不同的解,後來有人用圖論的方法解出 92 種結果。這個問題也一共有92種解法 思路分析 第乙個...