要求:在 8 * 8 的棋盤上,8 個皇后不在同行、同列、同對角線。
(1)定義衝突
>>> def conflict(state, nextx):
nexty = len(state)
for i in range(nexty):
if abs(state[i] - nextx) in (0, nexty - i):
return true
return false
其中,nextx 指下乙個皇后將要放置的橫座標,也就是列。nexty 指下乙個皇后將要放置的縱座標,即行。state是乙個列表,列表內存放著已經放置好的皇后的位置,即存放著元組 (x , y) ,state[ i ] = j 指第(i + 1)行的皇后在第(j + 1)列。
注: if abs(state[i] - nextx) in (0, nexty - i): 中的 (0, nexty - i): 指前面的數是否為 0 或者 nexty - i 兩者中的乙個,並不是指處在某個範圍裡面。
(2)放置皇后
>>> def queens(num = 8, state = ()):
for pos in range(num):
if not conflict(state, pos):
if len(state) == num - 1:
yield (pos,)
else:
for result in queens(num, state + (pos,)):
yield (pos,) + result
注:程式分為 if len(state) == num - 1: 和 else: 兩部分,是因為,遞迴都需要有乙個遞迴結束的點,否則,遞迴就會無止境的不斷進行下去。
其中, for pos in range(num): 這一行,指的是給將要放置的新皇后,她的縱座標已固定(由定義衝突裡的 nexty = len(state) 來固定的),所以,需要在8個列位置上,給她進行選擇放置的位置。
如果放置 4 個皇后,則有 2 種放置方法:
>>> list(queens(4))
[(1, 3, 0, 2), (2, 0, 3, 1)]
應用 print 可以把不同的放置方法,一行一行列印出來。
(3)打包輸出
輸出簡易的放置了皇后的棋盤。
>>> def prettyprint(solution):
def line(pos, length = len(solution)):
return '. ' * (pos) + 'x ' + '. ' * (length - pos - 1)
for pos in solution: #依次取出隨機挑選的方案裡的每個數,即每位皇后在自己的行中坐所在的列。
print (line(pos))
>>> import random
>>> prettyprint(random.choice(list(queens(8)))) #在queens(8) 的方案裡隨機挑選乙個
. . x . . . . .
. . . . . x . .
. . . . . . . x
. x . . . . . .
. . . x . . . .
x . . . . . . .
. . . . . . x .
. . . . x . . .
#!bin/usr/python
def conflict(state,nextx):
nexty=len(state)
for i in range(nexty):
if abs(nextx-state[i]) in (0,nexty-i):
return true
return false
def queen(side_length,state=()):
for pos in range(side_length):
if not conflict(state,pos):
if len(state)==side_length-1:
yield (pos,)
else:
for result in queen(side_length,state+(pos,)):
yield (pos,)+result
def prettyprint(solution):
def line(pos, length = len(solution)):
return '.'*(pos) + 'x' + '.'*(length-pos-1)
for pos in solution:
print line(pos)
for solution in list(queen(4)):
prettyprint(solution)
Python實現八皇后問題
八皇后問題是指8 8位的棋盤上,擺8個皇后,使得任意乙個皇后不在其他皇后的同一橫線上,同一豎線上,同一斜線 包括右上到左下斜線和左上到右下斜線 上。這個問題是乙個經典的遞迴問題。八皇后問題主函式 n 0 總的解的數量 defehh sovle deep,graph,path 解決八皇后問題的函式 f...
八皇后問題python實現
def check x,y 對當前行的所有行進行 for row in range x column queens row 不能是同一列 if y column return false 對角線 if abs x row abs y column return false return true d...
八皇后問題python實現
八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當 n 1 或...