首先,n皇后是乙個非常經典的遞迴+回溯的問題。
然後,寫乙個判斷函式check來判斷某個點是不是可以放置的點是該演算法的重點
# check函式,用來判斷點[row, col]是否可以放置皇后
defcheck
(board, row, col)
:for i in
range
(row)
:'''
上文已經指出,board用來儲存結果,其下標值表示皇后所在的行,改下標儲存的值表示皇后的列。
所以判斷是否同列的方法是:abs(board[i] - col) == 0
判斷是否在正對角線或反對角線的方法是:abs(board[i] - col) == abs(row - i),即斜率的絕對值是否等1
'''ifabs
(board[i]
- col)==0
orabs
(board[i]
- col)
==abs
(row - i)
:return
false
return
true
defeight_queen
(board, row)
: board_len =
len(board)
if row >= board_len:
''' 列印結果,1表示放置皇后
而且只需要一維陣列就可以表示結果,所以只需要用到col就可以了
'''for _, col in
enumerate
(board)
:print
(' 0 '
* col +
' 1 '
+' 0 '
*(board_len-
(col +1)
))print(''
)for col in
range
(board_len)
:if check(board, row, col)
: board[row]
= col
# 放置第row行的皇后之後,繼續放置第row+1行的皇后
eight_queen(board, row+1)
if __name__ ==
"__main__"
:# 初始化乙個4皇后棋盤
board =[0
]*4# 從第一行開始放置皇后
eight_queen(board,
0)
八皇后 N皇后問題 遞迴實現
八皇后問題,即在乙個棋盤上,每行都可以放置乙個皇后,但每個皇后都不能影響其他皇后的安全,即所有皇后的位置不能在同一直線上 解決問題方法及思想 遞迴 在使用遞迴之前首先要準備好兩個函式實現 1.判斷此時此刻位置是否安全 只需要判斷元素上方,左上方,右上方是否安全,且只要有乙個位置不安全,則結束判斷 2...
java實現N皇后問題
n皇后問題描述 將 n 個皇后擺放在乙個 n x n 的棋盤上,使得每乙個皇后都無法攻擊到其他皇后。深度優先遍歷的典型案例。程式輸入 n的個數 需 4 棋盤上任意乙個位置 程式輸出 滿足問題需求的棋盤座標 程式 如下 node類用於封裝皇后的棋盤位置資訊 public class node publ...
遞迴實現N皇后問題
因為每行只能放置乙個皇后,故可用一維陣列a儲存 第i行皇后的列數,即 a i j 表示第i行的皇后位於第j列。為方便起見,下標全部從1開始。它可以實時表示擺放的狀態。遞迴函式 queen i 可理解為 我們已經無衝突的擺放好了前 i 1 行的皇后並在陣列a中儲存,現在開始擺放第i行的皇后。對於第i行...