n後問題(python實現)

2021-10-02 08:49:38 字數 1881 閱讀 1187

程式實現

# 檢測(x,y)這個位置是否合法(不會被其他皇后攻擊到)

def check(board, row, col):

i = 0

for i in range(row):

if abs(board[i] - col) == 0 or abs(board[i] - col) == abs(i - row): #[i, j]與[row, col]處於同列或者同對角線上

return false

return true

def eightqueen(board, row):

border = len(board)

if row >= border: # 當行數等於最大邊界時,遞迴

for i, col in enumerate(board): #輸出從第一行到第board行結果

print('□ ' * col + '■ ' + '□ ' * (len(board) - 1 - col))#■為皇后位置

print("")

col = 0

while col < border:

for col in range(border):

if check(board, row, col): #如果這個位置合法的話,進行如下操作

board[row] = col

eightqueen(board, row + 1) #進行遞迴,使得行加一,即進入下一行

col += 1

board = [0 for i in range(8)] # 8皇后問題

首先我們要給定乙個矩陣,來存放棋子,從第一行開始遍歷,接著遍歷這一行的每一列。假設我們在位置[1, 2]處已經放上棋子,我們開始遍歷第二行,首先判斷[2,1]位置存放棋子是否可行,呼叫check函式,顯然與上一行棋子處於同一對角線,不行返回false,以此類推直到便利到位置[2,4]時這是乙個可行的位置,再繼續往下遍歷。

總結的來說就是在遍歷當前行時,之前行的棋子已經確定好了,從而以此判斷該行的各個位置是否可行。

當然對於主函式來說我們需要乙個遞迴終止的條件,很簡單當當前行數大於n時,我們就已經得到了乙個符合條件的矩陣。

除此之外,我們如果用矩陣儲存,每次都要通過遍歷來確定之前行棋子所在的位置,時間複雜度**。所以這裡做乙個簡化,我們用乙個[1, n]的矩陣來儲存,也就是說[row, col] = [i, board[i]],這樣我們只需要o(1)的時間複雜度就能知道上一行的資訊。

再說check函式,首先我們是一行行進行遍歷,一定不會存在同行的情況,同列也比較好判斷,對於正負對角線,通過觀察我們可以發現,我們設row,col為當前行當前列,那麼對於位置[i, j]。如果符合等式|row- i| = |col-j|,那麼[i, j]如[row, col]位於同一對角線。把上述兩種情況合併,如果if abs(col - j) == 0 or abs(col - j) == abs(row-i),那麼[i, j]與[row, col]必處於同列或者同對角線上。

python實現N皇后問題

首先,n皇后是乙個非常經典的遞迴 回溯的問題。然後,寫乙個判斷函式check來判斷某個點是不是可以放置的點是該演算法的重點 check函式,用來判斷點 row,col 是否可以放置皇后 defcheck board,row,col for i in range row 上文已經指出,board用來儲...

N後互不攻殺問題

題目 在n n的西洋棋盤上放置n個皇后,使它們彼 此互相不攻殺。皇后攻殺條件 處於同一行,或同一 列,或同一斜線的皇后彼此攻殺。試給出全部方案。我發現我和老師的思想老師不在乙個方向。上次的和質問題,我把 都寫在main 函式裡面,接過來時寫了很多函式。這次的n後問題,我寫了很多函式,老師卻都寫在ma...

回溯之n後問題

n後問題 在 n n格的棋盤上放置彼此不受攻擊的 n個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在 n n格的棋盤上放置 n個皇后,任何 2個皇后不放在同一行或同一列或同一斜線上。解向量 x1,x2,xn 顯約束 xi 1,2,n 隱約束 1 不同列...