n皇后問題(回溯法)——Python實現


八皇后問題
問題: 國際象棋棋盤是8 * 8的方格,每個方格里放一個棋子。皇后這種棋子可以攻擊同一行或者同一列或者斜線(左上左下右上右下四個方向)上的棋子。在一個棋盤上如果要放八個皇后,使得她們互相之間不能攻擊(即任意兩兩之間都不同行不同列不同斜線),求出一種(進一步的)布局方式。
 
【來源: https://www.cnblogs.com/franknihao/p/9416145.html 】具體講解與實現
 
1 def check(board,row,col): 2     i = 0 3     while i < row: 4         if abs(col-board[i]) in (0,abs(row-i)): 5             return False 6         i += 1
7     return True
 1 def EightQueen(board,row):  2     blen = len(board)  3     if row == blen:
 4         print(board)  5         return True  6     col = 0  7     while col < blen:  8         if check(board,row,col):  9             board[row] = col 10             if EightQueen(board,row+1): 11                 return True 12         col += 1
13     return False
1 def printBoard(board): 2     import sys 3     for i,col in enumerate(board): 4         sys.stdout.write('' * col + '' + '' * (len(board) - 1 - col)) 5         print( )

主函數調用:

1 board = [ [0]*8 for row in range(8) ] 2 EightQueen(board,0) 3 printBoard(board)

運行結果:

1 [0, 4, 7, 5, 2, 6, 1, 3] 2 ■ □ □ □ □ □ □ □ 3 □ □ □ □ ■ □ □ □ 4 □ □ □ □ □ □ □ ■ 5 □ □ □ □ □ ■ □ □ 6 □ □ ■ □ □ □ □ □ 7 □ □ □ □ □ □ ■ □ 8 □ ■ □ □ □ □ □ □ 9 □ □ □ ■ □ □ □ □

 此代碼只能輸出一種結果,實際上n皇后問題的解有多種。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM