n皇后问题(回溯法)——Python实现

你说的曾经没有我的故事 提交于 2019-12-01 17:36:20
八皇后问题
问题: 国际象棋棋盘是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 □ □ □ ■ □ □ □ □

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!